【.cmd】 バッチファイルスクリプト %13 【.bat】

■ このスレッドは過去ログ倉庫に格納されています
2018/11/21(水) 14:52:07.84ID:v84I4o+L
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %11 【.bat】©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1424858999/
【.cmd】 バッチファイルスクリプト %12 【.bat】
https://mevius.5ch.net/test/read.cgi/tech/1489207631/

それ以前の過去スレ
%10 http://peace.2ch.net/test/read.cgi/tech/1374205515/
%9  http://toro.2ch.net/test/read.cgi/tech/1335015478/
%8  http://toro.2ch.net/test/read.cgi/tech/1315844420/
%7  http://hibari.2ch.net/test/read.cgi/tech/1298873550/
%6  http://hibari.2ch.net/test/read.cgi/tech/1277465356/
%5  http://pc12.2ch.net/test/read.cgi/tech/1242268171/
%4  http://pc12.2ch.net/test/read.cgi/tech/1229955189/
%3  http://pc11.2ch.net/test/read.cgi/tech/1217860043/
%2  http://pc12.2ch.net/test/read.cgi/tech/1197881068/
%1  http://pc11.2ch.net/test/read.cgi/tech/1178281991/
2019/10/04(金) 05:33:06.84ID:igWxDR2f
>>398
いまいちVB.NETがどういう環境で使えるのか分からないし
PowerShellの実行を許可してない環境でも動くのかも分からないが
VB.NETのinputboxには256文字の入力制限が無い模様

Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.exec("powershell -NoProfile -ExecutionPolicy Unrestricted -C add-type -AssemblyName microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::InputBox('URLを入力してください', 'URL入力');")
Prompt = oExec.stdout.ReadLine()
End Function

'msgbox Prompt("test dayo","")
WScript.Echo Prompt("test dayo","")
2019/10/04(金) 06:57:13.54ID:2Xve1BBy
>>396
良く分からんが、こんなのでどうですかね?
-------foo.bat
@findstr ^^ < con
-------Prompt.vbs
Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.exec("foo.bat")
Prompt = oExec.stdout.ReadLine()
oExec.terminate
End Function
msgbox Prompt("test dayo","")
2019/10/04(金) 08:44:14.07ID:2Xve1BBy
バッチ不要だな
Set oExec = WshShell.exec("cmd /c findstr /R . < con")
最後に1023文字しか表示されないなReadLineのせいか?
2019/10/04(金) 12:18:00.19ID:mgLzdBVB
ありがとうございます
Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
'Set oExec = WshShell.exec("cmd /c title " & Replace(Replace(Text,vbCr,""),vbLf,"") & " && type con")
Set oExec = WshShell.exec("cmd /c cmd /c findstr /R . < con")
Prompt = oExec.stdout.ReadLine()
oExec.terminate
End Function
msgbox LEN(Prompt("test dayo",""))
でやると8190でるのでmsgboxの表示制限っぽいです
上限が512から8190まで増えました♪
2019/10/04(金) 12:44:51.20ID:2Xve1BBy
それは良かった
ところで cmd /c cmd /c と2重になってるのは何か意味が?
2019/10/04(金) 12:49:02.43ID:mgLzdBVB
単なるミスですw
2019/10/04(金) 20:33:36.96ID:igWxDR2f
>>402
HTAで作るって方向は無いのかな?
WScriptオブジェクトは使えないけど、IEと違ってローカル処理はできるよ
全部HTAにするのが面倒ならUI部分をHTAで作って
そこから、各々vbsを起動するようにするとか
サンプル http://www.42ch.net/UploaderSmall/source/1570156236.zip
2019/10/05(土) 07:49:09.72ID:XliNsfqD
ありがとうございます
HTAも便利そうですね
アドレスバー,リンクをドラッグドロップで取り込めるのがいいなと
2019/10/07(月) 16:39:36.79ID:/M5l0Sli
そういやHTAはHighDPI対応してないのかな
サーフェスで苦労した覚えが
2019/10/09(水) 19:08:15.06ID:tUBbtl1D
文字列の画面表示の桁数はバッチで取得できますか?
半角1で全角2での合計みたいな
2019/10/10(木) 19:46:16.73ID:NVkes/cJ
>>408

@echo off & if "%~1"=="1" goto x
set c=call "%~0" 1 ^^^| findstr /o /r .*
set o="skip=1 delims=:" & set /p s=文字列=
for /f %o% %%i in ('%c%') do set /a b=%%i-2
echo 桁数= %b% & pause & goto :eof
:x
setlocal enabledelayedexpansion
echo.!s!
echo.

入力はシフトJISで表示できる文字のみです。
CP932で正常に動作します。たぶん。
2019/10/10(木) 23:42:47.50ID:T8I5o9Ey
mode con かも
2019/10/11(金) 07:29:52.81ID:D9aa0x5a
>>409,>>410
ありがとうございました!
コードページは932でしたので問題ないです
これで複数のデータを右詰めで揃えて表示できました
タブ入りだと表示がズレますが自分で対処します
2019/10/18(金) 19:14:42.75ID:MUFbi2Ng
特定の2つのフォルダ内を一括削除するbatの作り方がわかりません…。
1つだけならば出来るのですが2つ指定するにはどうすればいいのでしょうか 
お願いします
2019/10/18(金) 19:26:30.68ID:sHZx2IDB
1行目にAフォルダを削除
次の行にBフォルダを削除でいいんじゃないの?

1行に書きたければ

複数のコマンドを続けて実行する
https://www.adminweb.jp/command/action/index1.html
2019/10/18(金) 19:28:12.11ID:DNcfAKqA
2回やるbatを作ればいいのでは?
2019/10/18(金) 19:29:32.93ID:DNcfAKqA
あ、かぶってしまった
2019/10/18(金) 22:56:14.67ID:ZkRket+3
for %%I in ( C:\AAA C:\BBB ) do del /Q %%I\*.*
2019/10/18(金) 23:57:13.31ID:uNKAmOCu
for /f %%i in ('dir /b^|find "foo"') do pause

fooが無かった場合pauseしてくれないのですが解決策ありませんか?
実際はfooの有無で分岐させるのですがとりあえずpauseで書いてます
2019/10/19(土) 00:21:50.04ID:nJ40H8MU
>>417
(for /f %%i in ('dir /b^|find "foo"') do pause) || pause
2019/10/19(土) 00:29:35.02ID:lUUAms6Y
>>418
ありがとう、できたらfor内で分岐したい…
2019/10/19(土) 00:34:28.69ID:nJ40H8MU
forのループは条件が一致しないとすり抜けて
1回も通らないで次のステートメントにいっちゃうから無理
無理矢理やろうとすると、ダミー項目を与えて必ず一度はforループを実行するようにして
その中でダミー項目だったら〜と条件判定することになる
2019/10/19(土) 00:43:02.67ID:nJ40H8MU
こんな感じ
for /f %%i in ('dir /b^|find "foo"^|^|echo none') do (if "%%i" equ "none" echo ありません)
2019/10/19(土) 00:49:42.45ID:nJ40H8MU
俺としては>>418の方が見やすくて間違いが少なくて済むと思う
2019/10/19(土) 01:05:43.14ID:lUUAms6Y
なるほど||つかう手もあるんですね
for入れ子にしてるから||でいきますありがとう
2019/10/19(土) 01:26:01.92ID:nJ40H8MU
forの後で、%errorlevel%で判断できるかと思ったけど
forのコマンドは子タスクで実行されるから環境を親タスクに引き継がないんだね
こういうことはパイプの右側でも起きるけど
2019/10/19(土) 07:15:14.93ID:azMLqhGk
for /f "delims=" %%i in ('dir/b *foo* 2^>nul ^|^| echo *') do (
if "%%~i"=="*" (echo ないよ) else echo %%i
)
2019/10/20(日) 07:21:20.34ID:bUbbfXYV
for /f "delims=" %%i in ('"dir/b *foo* 2>&1"') do if not exist %%i echo %%i
2019/10/21(月) 18:09:26.80ID:8RixcIVS
なんか古代呪文を撃ちあってるみたい(^_^;)
2019/10/21(月) 21:05:31.60ID:Sv6Oxatw
そう、実は、古代語魔術(ハイエンシェント)を打ち合っているのです。
スレ違いだけれど、

魔法の使い方
https://eman-physics.net/columns/magic.html

を、思い出した。
2019/10/21(月) 22:05:11.02ID:nEQALG6h
ザイログニーモニックは忘れた
2019/10/22(火) 23:09:34.31ID:jiuE9ZBi
詠唱せよ
431デフォルトの名無しさん
垢版 |
2019/10/27(日) 14:29:49.16ID:Lik42TLZ
cmd.exe /c start ってネットワークドライブのファイル開けないんでしたっけ?

cmd.exe /c start t:\test.txt ってやると
アクセスが拒否されました。って表示される。c:\以下なら大丈夫

cmd.exe /c start file:\\t:\test.txt ってやれば開けるからいいんだけど
2019/10/27(日) 19:40:17.02ID:n+Gkmfbl
cmd /c start t:\test.txt

start t:\test.txt
の違いは?
433デフォルトの名無しさん
垢版 |
2019/10/27(日) 19:45:47.81ID:QHyOIS3t
startが内部コマンド
2019/10/27(日) 19:54:44.57ID:n+Gkmfbl
なんで cmd /c が必要?
435デフォルトの名無しさん
垢版 |
2019/10/27(日) 22:46:50.23ID:8uvk7ayg
>>434
ぐぐれかす
2019/10/27(日) 23:17:38.75ID:cNZwDfUU
>>434
内部コマンドは実行可能なモジュールではなく、cmd内部でのみ実行可能だから。
内部コマンドはcmdで解釈・実行される。
2019/10/28(月) 01:22:07.40ID:YqbFbBrf
>>434
バッチでは cmd /c は不要ですね。
cmd /c があれば子プロセスになります。
どっちも結果は同じ。エディタが起動します。
「ファイル名を指定して実行」の入力なら、
cmd /c start は不要かと思います。
でも、あっても間違いではないです。
2019/10/28(月) 02:10:13.65ID:t0sY5Haq
そんなこと聞いてないから、>>431に答えてくれ
439438
垢版 |
2019/10/28(月) 02:18:17.09ID:bqlyCkZ6
ネットワークフォルダをドライブに割り当てた問題かと思えば
関係なさそうだ。でも不思議だ

cmd.exe /c start \\server\folder だとフォルダが開ける
cmd.exe /c start \\server\folder\subfolder でも問題ない

cmd.exe /c start \\server\folder\test.txt だとアクセスが拒否される
でもエクスプローラーのアドレスバーに ↑ を入れるとメモ帳で開ける
2019/10/28(月) 03:05:07.76ID:ML+fUsJB
管理者権限でやってみては?
441438
垢版 |
2019/10/28(月) 03:54:57.58ID:bqlyCkZ6
アクセスが拒否されました
2019/10/28(月) 07:04:53.54ID:YqbFbBrf
>>438 すみません。私には分かりません。
cmd/c を省略、 さらに start を省略しても同じアクセス拒否ですか?
2019/10/28(月) 08:16:04.60ID:kjzN6NI8
>>439
>cmd.exe /c start \\server\folder\test.txt だとアクセスが拒否される
>でもエクスプローラーのアドレスバーに ↑ を入れるとメモ帳で開ける

このコマンドには、メモ帳を起動すると書いていないから、起動できないだろ

拡張子から、起動するアプリを取得できないだろ?

そういう情報は、レジストリに入っているから、
バッチファイルから、そこへアクセスできるか?
444443
垢版 |
2019/10/28(月) 08:20:10.88ID:kjzN6NI8
普通に「notepad パス付きファイル名」なら、起動できるだろ?
2019/10/29(火) 07:53:25.61ID:SHkVBveq
>>439
エクスプローラーのバーに書くのも cmd/c start は要らんぞ
2019/10/29(火) 11:55:42.58ID:w4Uxvw1j
>>443
バッチからでも関連付け起動できるぞ
2019/10/29(火) 12:51:26.56ID:SHkVBveq
file:\\C:\Program Files (x86)\TeraPad\TeraPad.exe


>>446
>>443 は.txtの関連付けはメモ帳とは限らんと言ってる


notepad.exe がネットワークドライブのファイル名を処理できるかは知らんが
notepad file:\\t:\test.txt
みたいなのではダメだろうな
start file:\\t:\test.txt
なら良さそうだが
2019/10/29(火) 12:53:59.00ID:SHkVBveq
ああ1行目にゴミが付いたw 無視してくれ
449デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:09:40.06ID:YQKoC2Uo
コマンドプロンプトの文字コードがよくわからん。
なんでchcp 932なのにUnicodeが表示できてるんだ?
chcpの設定とは無関係に画面はUnicodeで変換してるんか?
2019/10/29(火) 13:26:49.20ID:SHkVBveq
バッチはSJIS
リダイレクトするとSJIS
画面はユニコード
set はユニコード特有文字でも入る(cmd画面で入力なら)
cmdの内部処理はユニコード
451デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:34:20.85ID:spBBwL/I
Unicodeはいいが文字コードは何なんだ?
UTF-8なのか?UTF-16なのか?
2019/10/29(火) 13:37:09.01ID:SHkVBveq
16
453デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:40:11.15ID:spBBwL/I
>>452
と思うやろ?

typeコマンドは文字コード変換してるかもしれんなと思って
copy ファイル名 CON なら、そのまんま表示されるだろうと
思ってやってみたら、

UTF-8は問題なく表示されて、UTF-16は文字化けしてるんだよ。
Windows 10で仕様でも変わったんか?
2019/10/29(火) 13:47:51.80ID:SHkVBveq
変わらず
後は自分で調べろ
455デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:53:47.92ID:spBBwL/I
わからんのかーいw
2019/10/29(火) 14:01:37.87ID:SHkVBveq
図に乗るな
457デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:15:50.84ID:spBBwL/I
やっぱり仕様が変わってた。

Windows 7だとchcp 932の時、
copy test.txt CON で正しく表示できるのはShiftJISだけ
UTF-8でもUTF-16LEでも文字化けする。

Windows 10だと逆に、UTF-8(BOMなし)、UTF-16LEは
正しく表示できるが、ShiftJISは文字化けする。
2019/10/29(火) 14:23:41.56ID:SHkVBveq
そうなのか
でも内部が16だと思うが
分からん
459デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:27:54.02ID:spBBwL/I
Windows 7でもdirコマンドでShiftJISにない文字は表示できてるから
最終的にはUnicodeなんだろう(おそらくUTF16だと思うが)
その途中になんかあるんだろうな。

Windows 10でcopy CONつかってるのに、UTF-8とUTF-16の両方が
文字化けしないのが不思議だ・・・って思ったら、
あれ?UTF-16文字化けしてた。んん?間違ってtypeで表示してたか。
これなら理解できる。
2019/10/29(火) 14:44:03.37ID:XkpxJQc3
>>457
いつのWindows10だね?
461デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:52:33.20ID:spBBwL/I
>>460
今の最新の公式リリース
462デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:56:43.68ID:spBBwL/I
なんかわかりづらくなったので再掲

copy test.txt CONで検証

Windows7、chcp 932・・・text.txt が ShiftJIS だと正しく表示される
Windows10、chcp 932・・・text.txt が UTF-8(BOMなし) だと正しく表示される
2019/10/29(火) 16:52:33.42ID:spBBwL/I
なんかいろいろ勘違いしてたっぽい
copy CONつかってもどこかの誰かが変換かましてるっぽい

こんな漢字でバイナリ直接吐き出したら、chcp 932ではSJISしか正しく表示されなかった。
chcp 65001にしたらUTF8だけ
Windows 10でだけど、たぶんWindows 7でも同じじゃないかな?

#include <iostream>
int main()
{
unsigned char str[] = { 0xE6, 0xBC, 0xA2, 0xE5, 0xAD, 0x97, 0xE2, 0x9D, 0xA4 };
std::cout.write((char*)&str, sizeof(str));
}
2019/10/29(火) 17:46:22.44ID:4a4kNF+Q
一つわかった気がする。

コマンドプロンプトはUnicode対応してるけどバッチファイルはUnicode対応じゃないんだ。
(正確にはchcp 65001を実行すれば、UTF-8のバッチファイルを実行できる)

だからchcp 932のままコマンドプロンプトでUnicode文字を使うことができるけど
バッチファイルにするとそれができない。
2019/10/29(火) 17:46:59.43ID:wQOUEDyj
テキストストリームだけしか通さないから何らかの変換が入ってるのかも知れないね
copy /b hoge.txt con
指定されたデバイスに書き込めません。
0 個のファイルをコピーしました。
2019/10/29(火) 18:03:33.66ID:4a4kNF+Q
あ、copyに/bオプションなんてあったのか・・・
2019/10/29(火) 18:10:48.74ID:4a4kNF+Q
そんな馬鹿な・・・。Windows 10でもShiftJISじゃないと表示されなくなっただと?
何度も確認したはずだぞ???
2019/10/29(火) 18:37:30.30ID:tLCpEMn0
Windows10については徐々に更新されているらしい

Windows Command-Line: Unicode and UTF-8 Output Text Buffer
https://devblogs.microsoft.com/commandline/windows-command-line-unicode-and-utf-8-output-text-buffer/
2019/10/29(火) 19:04:08.72ID:SHkVBveq
少し前にここで同様の話題が有ったが UTF-8(BOM無し) のテキストは
たとえ chcp 65001 しても type で一部分文字化けする

findstr ^^ foo.txt

で正常に表示されるはず(chcp 65001 で)
2019/10/29(火) 19:08:30.96ID:SHkVBveq
あと chcp 65001 しても UTF-8 のバッチは
正常に動作しないと思った方がいい
471デフォルトの名無しさん
垢版 |
2019/10/29(火) 20:31:39.34ID:ltL5L5Cn
あぁ、クソ。意味がわからんけど、理由がわかった。

1. まず、utf8.txt の中身をUTF-8で作る。ShiftJISにない文字も入れておく。
2. chcp を実行。「現在のコード ページ: 932」と表示されることを確認する。
3. コマンドプロンプトを起動して、type utf8.txt にして文字化けすることを確認する

ここまではなんの変哲もない。

4. powershell.exe -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8 を実行する
5. type utf8.txt を実行すると文字化けしない(!)
6. chcp を実行。「Active code page: 932」と表示される。932なのになぜか英語(!)

chcpを変更してもとに戻すと、元に戻るし、
powershell -Command [Console]::OutputEncoding = [Text.Encoding]::Default を実行しても元に戻る

子プロセスであるはずのpowershellがなにかコマンドプロンプトの状態を変えてやがる。
なんだこれ?コマンドプロンプトに英語モードとかあったっけ?
2019/10/29(火) 20:34:10.83ID:ltL5L5Cn
コマンドプロンプトを起動するのは2の時の間違いな
2019/10/29(火) 20:38:52.72ID:ltL5L5Cn
この話から気づくと思うけど、

powershell -Command [Console]::OutputEncoding
初期状態は、日本語 (シフト JIS)

powershell -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8
これでUTF-8に変更して

powershell -Command [Console]::OutputEncoding
現在の設定を確認すると、UTF-8になってる。

chcpの値は変わらんのに、コードページを変えることができてしまっているかのようだ。
2019/10/29(火) 21:33:51.82ID:ltL5L5Cn
Windows 7にPowerShell6をインストールしてやってみたけど、
pwsh -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8 で
コードページが変わるな。Windows 7はまともに動かないので画面がバグるw
2019/10/29(火) 21:41:58.40ID:ltL5L5Cn
なるほど、SetConsoleOutputCPでコマンドプロンプトのコードページを変更できるらしい

http://tooljp.com/language/C-Languate/sample-code/SetConsoleOutputCP-sample-code.html
2019/10/30(水) 07:47:21.02ID:WNRoeYsC
おれもコードページ弄って色々やったが上手くいかなかった
typeは一部ダメ、moreは全くダメ、findstrはリダイレクトするとダメ、
copy〜conは utf-7とjis が一部ダメ、
for〜do echoでやると空行が抜けてダメという具合
2019/10/30(水) 08:50:12.52ID:BvOaIOcB
エディタがあれば必要ない
2019/10/30(水) 11:07:44.00ID:iT3/p0k9
>>476
なんとなく画面に表示する部分にバグがあるから
バッチファイル内で閉じて画面に表示しなければ、chcp 65001で動くような気がする。
あとWindows 10ではそこらへんが直ってるので同じように考えるのは早計
2019/10/30(水) 11:25:55.22ID:iT3/p0k9
Windows 7でこれが文字化けせずに動いた
chcpで画面はクリアされるが、正しく出力される。

↓UTF8 + CRLFで作成

@echo off
chcp 65001
set A=ユニコード文字
chcp 932
echo %A%
2019/10/30(水) 12:04:53.93ID:BvOaIOcB
>>262 みたいのは今でも化けるね
>>476 はWindows10だと思う
どっちにしろ不具合を把握しとくのは大事だね
2019/10/30(水) 12:11:59.20ID:n2bLSC2q
chcp 65001 にしてもcmd /u で開き直さなきゃバグるんじゃない?
2019/10/30(水) 12:17:27.39ID:4eNYSN+t
chcpやってモード変更したとしても
既に開いたハンドルは開いたときのモードのままだろうからね
2019/10/30(水) 12:27:14.70ID:iT3/p0k9
>>480
化けると言うよりか、文字の終わりを正しく認識できてない感じ
これならうまくいく。
まずchcpをifの()内でやるとおかしくなる。
その上でsetする文字をダブルクォートでくくらなかったらおかしくなった
なのでダブルクォートくくって、出力時に外してる。

@echo off
chcp 65001
set A=
set B=
if "hoge"=="hoge" (
set A="あああ"
set B="いいい"
)
chcp 932
call :output %A% %B%
exit /b

:output
echo %~1
echo %~2
2019/10/30(水) 12:29:13.59ID:iT3/p0k9
ちなみに >>483 はchcp65001した状態でバッチファイルを実行すれば
バッチファイルの中でchcpせずに動く

あとファイルの文字コードはUTF8な
2019/10/30(水) 12:32:44.17ID:iT3/p0k9
>>482
そうとは限らない。

chcpはどうやら内部でSetConsoleOutputCPを呼び出してるんだろうけど

SetConsoleOutputCPっていうのはConsole APIの一つで、
コマンドプロンプトのコードページを変更する。

このAPIは子プロセスから親プロセスをたどって見つけた
コンソール(コマンドプロンプト)のコードページを変更できる。

ハンドルのモードは関係なく、コンソールのコードページの話
2019/10/30(水) 12:38:00.67ID:iT3/p0k9
>>252の改良でこれならうまく動くんだよな
ダブルクォートはいるけど。
あとecho あああa みたいに最後をASCII文字にしても動く

@echo off
chcp 65001
if "hoge"=="hoge" (
echo "あああ"
echo "いいい"
)
2019/10/30(水) 12:45:45.44ID:iT3/p0k9
こうすりゃいいのかw

@echo off
chcp 65001
if "hoge"=="hoge" (
call :echo "あああ"
call :echo "いいい"
)

exit /b

:echo
echo %~1
2019/10/30(水) 12:46:49.70ID:iT3/p0k9
まあバッチファイルでchcp 65001を使うのはやめたほうがいいと思うけど
ワークアラウンドでどうにか対応できなくはないかもしれないw
2019/10/30(水) 13:25:11.54ID:iT3/p0k9
上の方でcmdがだめならPowerShellを使えばいいじゃないみたいなことが書いてあるけど、
UTF8の出力に関しては、コンソールの問題だから
Windows 7、8.1 ではPowerShellでもバグるんだよな

Windows 7にPowerShell6を入れてみたが、デフォルトで
「あいう」というファイル名が「ああいいうう」と表示される上に
[Console]::OutputEncoding = [Text.Encoding]::UTF8 すると
出力できませんみたいなエラーが発生するw

つまりWindows 7+PowerShell6だと日本語ファイル名は正しく表示されない
標準搭載のPowerShell 2なら問題ないんだけどね
2019/10/30(水) 13:41:42.20ID:zJjGNXoj
それは
>これは、$OutputEncoding が Default だと US-ASCII になっているので、S-JIS 文字列を渡そうとしてもリダイレクト時に日本語がうまく扱えないからです。
>結論から言うと、$OutputEncoding を S-JIS に変更して clip.exe にリダイレクトすれば文字化けしません。
これが関係するのかな?
2019/10/30(水) 13:53:29.35ID:ecgQNQwo
hoge ディレクトリに
 test_1.txt  …半角スペースなし
 test 2.txt  …半角スペースあり
 test 3.txt  …全角スペースあり
がある場合に

@echo off
for /f "usebackq" %%I in (`dir /b "hoge"`) do echo %%I

というバッチファイルを実行すると
 test_1.txt
 test
 test 3.txt
となって、普通に dir /b "hoge" を実行した結果と異なり、
半角スペースのある文字列(test 2.txt)を渡せないのだけれど、
どうしたらいいですか?
2019/10/30(水) 13:53:40.11ID:iT3/p0k9
どこの記事だよw まあググったが。
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm
2019/10/30(水) 14:08:53.46ID:iT3/p0k9
clipは使ったのことがないので実験。
あとPowerShellのバージョンで色々変わるので、
その記事の内容から検証しないといかんw

■コマンドプロンプトより
・chcp 932の場合
OK: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe

・chcp 65001の場合
OK: echo あいう | clip.exe
OK: echo (ユニコード文字) | clip.exe


■Windows 10 の PowerShell 5.1より
・[Console]::OutputEncoding = [Text.Encoding]::Default (Code Page 932)
NG: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe

・[Console]::OutputEncoding = [Text.Encoding]::UTF8
NG: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe


■PowerShell 6.2より
・[Console]::OutputEncoding = [Text.Encoding]::Default (Code Page 65001)
NG: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe

ただし、コマンドプロンプトおよびPowerShell 5.1では
?になるのにたいしてこっちは文字化けする
2019/10/30(水) 14:13:56.47ID:iT3/p0k9
ここはPowerShellのスレじゃないんだがw

$OutputEncoding と [Console]::$OutputEncoding は別もんなんか!?
[Console]は[Console]::WriteLine とか使うときだけかな?
2019/10/30(水) 14:16:01.69ID:n2bLSC2q
>>491
"usebackq delims="
2019/10/30(水) 14:21:07.12ID:iT3/p0k9
[Console]::OutputEncoding と $OutputEncoding の
両方をUTF8にしたらユニコード文字含めて文字化けしなかった。

■Windows 10 の PowerShell 5.1より

・[Console]::OutputEncoding = [Text.Encoding]::UTF8
?になる: echo あいう | clip.exe
?になる: echo (ユニコード文字) | clip.exe

・$OutputEncoding = [Text.Encoding]::UTF8
?文字化け: echo あいう | clip.exe
?文字化け: echo (ユニコード文字) | clip.exe

???・[Console]::OutputEncoding + $OutputEncoding = [Text.Encoding]::UTF8
?OK: echo あいう | clip.exe
??OK: echo (ユニコード文字) | clip.exe
2019/10/30(水) 14:22:18.15ID:iT3/p0k9
なぜか書き込みにゴミが入った・・・

■Windows 10 の PowerShell 5.1より

・[Console]::OutputEncoding = [Text.Encoding]::UTF8
?になる: echo あいう | clip.exe
?になる: echo (ユニコード文字) | clip.exe

・$OutputEncoding = [Text.Encoding]::UTF8
文字化け: echo あいう | clip.exe
文字化け: echo (ユニコード文字) | clip.exe

・[Console]::OutputEncoding + $OutputEncoding = [Text.Encoding]::UTF8
OK: echo あいう | clip.exe
OK: echo (ユニコード文字) | clip.exe
2019/10/30(水) 14:24:19.49ID:ecgQNQwo
>>495
あら、そんなことだったんだ
どうもありがとう
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況