1 名前:デフォルトの名無しさん mailto:sage [2018/11/21(水) 14:52:07.84 ID:v84I4o+L.net] 拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる 質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。 ※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。 前スレ 【.cmd】 バッチファイルスクリプト %11 【.bat】©2ch.net echo.2ch.net/test/read.cgi/tech/1424858999/ 【.cmd】 バッチファイルスクリプト %12 【.bat】 https://mevius.5ch.net/test/read.cgi/tech/1489207631/ それ以前の過去スレ %10 peace.2ch.net/test/read.cgi/tech/1374205515/ %9 toro.2ch.net/test/read.cgi/tech/1335015478/ %8 toro.2ch.net/test/read.cgi/tech/1315844420/ %7 hibari.2ch.net/test/read.cgi/tech/1298873550/ %6 hibari.2ch.net/test/read.cgi/tech/1277465356/ %5 pc12.2ch.net/test/read.cgi/tech/1242268171/ %4 pc12.2ch.net/test/read.cgi/tech/1229955189/ %3 pc11.2ch.net/test/read.cgi/tech/1217860043/ %2 pc12.2ch.net/test/read.cgi/tech/1197881068/ %1 pc11.2ch.net/test/read.cgi/tech/1178281991/
414 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 05:33:06.84 ID:igWxDR2f.net] >>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","")
415 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 06:57:13.54 ID:2Xve1BBy.net] >>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","")
416 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 08:44:14.07 ID:2Xve1BBy.net] バッチ不要だな Set oExec = WshShell.exec("cmd /c findstr /R . < con") 最後に1023文字しか表示されないなReadLineのせいか?
417 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 12:18:00.19 ID:mgLzdBVB.net] ありがとうございます 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まで増えました♪
418 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 12:44:51.20 ID:2Xve1BBy.net] それは良かった ところで cmd /c cmd /c と2重になってるのは何か意味が?
419 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 12:49:02.43 ID:mgLzdBVB.net] 単なるミスですw
420 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 20:33:36.96 ID:igWxDR2f.net] >>402 HTAで作るって方向は無いのかな? WScriptオブジェクトは使えないけど、IEと違ってローカル処理はできるよ 全部HTAにするのが面倒ならUI部分をHTAで作って そこから、各々vbsを起動するようにするとか サンプル www.42ch.net/UploaderSmall/source/1570156236.zip
421 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 07:49:09.72 ID:XliNsfqD.net] ありがとうございます HTAも便利そうですね アドレスバー,リンクをドラッグドロップで取り込めるのがいいなと
422 名前:デフォルトの名無しさん mailto:sage [2019/10/07(月) 16:39:36.79 ID:/M5l0Sli.net] そういやHTAはHighDPI対応してないのかな サーフェスで苦労した覚えが
423 名前:デフォルトの名無しさん mailto:sage [2019/10/09(水) 19:08:15.06 ID:tUBbtl1D.net] 文字列の画面表示の桁数はバッチで取得できますか? 半角1で全角2での合計みたいな
424 名前:デフォルトの名無しさん mailto:sage [2019/10/10(木) 19:46:16.73 ID:NVkes/cJ.net] >>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 桁数=
425 名前: %b% & pause & goto :eof :x setlocal enabledelayedexpansion echo.!s! echo. 入力はシフトJISで表示できる文字のみです。 CP932で正常に動作します。たぶん。 [] [ここ壊れてます]
426 名前:デフォルトの名無しさん mailto:sage [2019/10/10(木) 23:42:47.50 ID:T8I5o9Ey.net] mode con かも
427 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 07:29:52.81 ID:D9aa0x5a.net] >>409 ,>>410 ありがとうございました! コードページは932でしたので問題ないです これで複数のデータを右詰めで揃えて表示できました タブ入りだと表示がズレますが自分で対処します
428 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 19:14:42.75 ID:MUFbi2Ng.net] 特定の2つのフォルダ内を一括削除するbatの作り方がわかりません…。 1つだけならば出来るのですが2つ指定するにはどうすればいいのでしょうか お願いします
429 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 19:26:30.68 ID:sHZx2IDB.net] 1行目にAフォルダを削除 次の行にBフォルダを削除でいいんじゃないの? 1行に書きたければ 複数のコマンドを続けて実行する https://www.adminweb.jp/command/action/index1.html
430 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 19:28:12.11 ID:DNcfAKqA.net] 2回やるbatを作ればいいのでは?
431 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 19:29:32.93 ID:DNcfAKqA.net] あ、かぶってしまった
432 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 22:56:14.67 ID:ZkRket+3.net] for %%I in ( C:\AAA C:\BBB ) do del /Q %%I\*.*
433 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 23:57:13.31 ID:uNKAmOCu.net] for /f %%i in ('dir /b^|find "foo"') do pause fooが無かった場合pauseしてくれないのですが解決策ありませんか? 実際はfooの有無で分岐させるのですがとりあえずpauseで書いてます
434 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:21:50.04 ID:nJ40H8MU.net] >>417 (for /f %%i in ('dir /b^|find "foo"') do pause) || pause
435 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:29:35.02 ID:lUUAms6Y.net] >>418 ありがとう、できたらfor内で分岐したい…
436 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:34:28.69 ID:nJ40H8MU.net] forのループは条件が一致しないとすり抜けて 1回も通らないで次のステートメントにいっちゃうから無理 無理矢理やろうとすると、ダミー項目を与えて必ず一度はforループを実行するようにして その中でダミー項目だったら〜と条件判定することになる
437 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:43:02.67 ID:nJ40H8MU.net] こんな感じ for /f %%i in ('dir /b^|find "foo"^|^|echo none') do (if "%%i" equ "none" echo ありません)
438 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:49:42.45 ID:nJ40H8MU.net] 俺としては>>418 の方が見やすくて間違いが少なくて済むと思う
439 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 01:05:43.14 ID:lUUAms6Y.net] なるほど||つかう手もあるんですね for入れ子にしてるから||でいきますありがとう
440 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 01:26:01.92 ID:nJ40H8MU.net] forの後で、%errorlevel%で判断できるかと思ったけど forのコマンドは子タスクで実行されるから環境を親タスクに引き継がないんだね こういうことはパイプの右側でも起きるけど
441 名前: mailto:sage [2019/10/19(Sat) 07:15:14 ID:azMLqhGk.net] for /f "delims=" %%i in ('dir/b *foo* 2^>nul ^|^| echo *') do ( if "%%~i"=="*" (echo ないよ) else echo %%i )
442 名前:デフォルトの名無しさん mailto:sage [2019/10/20(日) 07:21:20.34 ID:bUbbfXYV.net] for /f "delims=" %%i in ('"dir/b *foo* 2>&1"') do if not exist %%i echo %%i
443 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 18:09:26.80 ID:8RixcIVS.net] なんか古代呪文を撃ちあってるみたい(^_^;)
444 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 21:05:31.60 ID:Sv6Oxatw.net] そう、実は、古代語魔術(ハイエンシェント)を打ち合っているのです。 スレ違いだけれど、 魔法の使い方 https://eman-physics.net/columns/magic.html を、思い出した。
445 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 22:05:11 ID:nEQALG6h.net] ザイログニーモニックは忘れた
446 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 23:09:34.31 ID:jiuE9ZBi.net] 詠唱せよ
447 名前:デフォルトの名無しさん [2019/10/27(日) 14:29:49.16 ID:Lik42TLZ.net] cmd.exe /c start ってネットワークドライブのファイル開けないんでしたっけ? cmd.exe /c start t:\test.txt ってやると アクセスが拒否されました。って表示される。c:\以下なら大丈夫 cmd.exe /c start file:\\t:\test.txt ってやれば開けるからいいんだけど
448 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 19:40:17.02 ID:n+Gkmfbl.net] cmd /c start t:\test.txt と start t:\test.txt の違いは?
449 名前:デフォルトの名無しさん [2019/10/27(日) 19:45:47.81 ID:QHyOIS3t.net] startが内部コマンド
450 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 19:54:44.57 ID:n+Gkmfbl.net] なんで cmd /c が必要?
451 名前:デフォルトの名無しさん [2019/10/27(日) 22:46:50.23 ID:8uvk7ayg.net] >>434 ぐぐれかす
452 名前:蟻人間 mailto:sage [2019/10/27(日) 23:17:38.75 ID:cNZwDfUU.net] >>434 内部コマンドは実行可能なモジュールではなく、cmd内部でのみ実行可能だから。 内部コマンドはcmdで解釈・実行される。
453 名前:デフォルトの名無しさん mailto:sage [2019/10/28(月) 01:22:07 ID:YqbFbBrf.net] >>434 バッチでは cmd /c は不要ですね。 cmd /c があれば子プロセスになります。 どっちも結果は同じ。エディタが起動します。 「ファイル名を指定して実行」の入力なら、 cmd /c start は不要かと思います。 でも、あっても間違いではないです。
454 名前:デフォルトの名無しさん mailto:sage [2019/10/28(月) 02:10:13 ID:t0sY5Haq.net] そんなこと聞いてないから、>>431 に答えてくれ
455 名前:438 mailto:sage [2019/10/28(月) 02:18:17.09 ID:bqlyCkZ6.net] ネットワークフォルダをドライブに割り当てた問題かと思えば 関係なさそうだ。でも不思議だ cmd.exe /c start \\server\folder だとフォルダが開ける cmd.exe /c start \\server\folder\subfolder でも問題ない cmd.exe /c start \\server\folder\test.txt だとアクセスが拒否される でもエクスプローラーのアドレスバーに ↑ を入れるとメモ帳で開ける
456 名前:デフォルトの名無しさん mailto:sage [2019/10/28(月) 03:05:07.76 ID:ML+fUsJB.net] 管理者権限でやってみては?
457 名前:438 mailto:sage [2019/10/28(月) 03:54:57.58 ID:bqlyCkZ6.net] アクセスが拒否されました
458 名前:デフォルトの名無しさん mailto:sage [2019/10/28(月) 07:04:53 ID:YqbFbBrf.net] >>438 すみません。私には分かりません。 cmd/c を省略、 さらに start を省略しても同じアクセス拒否ですか?
459 名前:デフォルトの名無しさん mailto:sage [2019/10/28(月) 08:16:04.60 ID:kjzN6NI8.net] >>439 >cmd.exe /c start \\server\folder\test.txt だとアクセスが拒否される >でもエクスプローラーのアドレスバーに ↑ を入れるとメモ帳で開ける このコマンドには、メモ帳を起動すると書いていないから、起動できないだろ 拡張子から、起動するアプリを取得できないだろ? そういう情報は、レジストリに入っているから、 バッチファイルから、そこへアクセスできるか?
460 名前:443 mailto:sage [2019/10/28(月) 08:20:10.88 ID:kjzN6NI8.net] 普通に「notepad パス付きファイル名」なら、起動できるだろ?
461 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 07:53:25 ID:SHkVBveq.net] >>439 エクスプローラーのバーに書くのも cmd/c start は要らんぞ
462 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 11:55:42.58 ID:w4Uxvw1j.net] >>443 バッチからでも関連付け起動できるぞ
463 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 12:51:26.56 ID:SHkVBveq.net] file:\\C:\Program Files (x86)\TeraPad\TeraPad.exe >>446 >>443 は.txtの関連付けはメモ帳とは限らんと言ってる notepad.exe がネットワークドライブのファイル名を処理できるかは知らんが notepad file:\\t:\test.txt みたいなのではダメだろうな start file:\\t:\test.txt なら良さそうだが
464 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 12:53:59.00 ID:SHkVBveq.net] ああ1行目にゴミが付いたw 無視してくれ
465 名前:デフォルトの名無しさん [2019/10/29(火) 13:09:40.06 ID:YQKoC2Uo.net] コマンドプロンプトの文字コードがよくわからん。 なんでchcp 932なのにUnicodeが表示できてるんだ? chcpの設定とは無関係に画面はUnicodeで変換してるんか?
466 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 13:26:49.20 ID:SHkVBveq.net] バッチはSJIS リダイレクトするとSJIS 画面はユニコード set はユニコード特有文字でも入る(cmd画面で入力なら) cmdの内部処理はユニコード
467 名前:デフォルトの名無しさん [2019/10/29(火) 13:34:20.85 ID:spBBwL/I.net] Unicodeはいいが文字コードは何なんだ? UTF-8なのか?UTF-16なのか?
468 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 13:37:09.01 ID:SHkVBveq.net] 16
469 名前:デフォルトの名無しさん [2019/10/29(火) 13:40:11.15 ID:spBBwL/I.net] >>452 と思うやろ? typeコマンドは文字コード変換してるかもしれんなと思って copy ファイル名 CON なら、そのまんま表示されるだろうと 思ってやってみたら、 UTF-8は問題なく表示されて、UTF-16は文字化けしてるんだよ。 Windows 10で仕様でも変わったんか?
470 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 13:47:51.80 ID:SHkVBveq.net] 変わらず 後は自分で調べろ
471 名前:デフォルトの名無しさん [2019/10/29(火) 13:53:47.92 ID:spBBwL/I.net] わからんのかーいw
472 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 14:01:37.87 ID:SHkVBveq.net] 図に乗るな
473 名前:デフォルトの名無しさん [2019/10/29(火) 14:15:50.84 ID:spBBwL/I.net] やっぱり仕様が変わってた。 Windows 7だとchcp 932の時、 copy test.txt CON で正しく表示できるのはShiftJISだけ UTF-8でもUTF-16LEでも文字化けする。 Windows 10だと逆に、UTF-8(BOMなし)、UTF-16LEは 正しく表示できるが、ShiftJISは文字化けする。
474 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 14:23:41.56 ID:SHkVBveq.net] そうなのか でも内部が16だと思うが 分からん
475 名前:デフォルトの名無しさん [2019/10/29(火) 14:27:54.02 ID:spBBwL/I.net] Windows 7でもdirコマンドでShiftJISにない文字は表示できてるから 最終的にはUnicodeなんだろう(おそらくUTF16だと思うが) その途中になんかあるんだろうな。 Windows 10でcopy CONつかってるのに、UTF-8とUTF-16の両方が 文字化けしないのが不思議だ・・・って思ったら、 あれ?UTF-16文字化けしてた。んん?間違ってtypeで表示してたか。 これなら理解できる。
476 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 14:44:03.37 ID:XkpxJQc3.net] >>457 いつのWindows10だね?
477 名前:デフォルトの名無しさん [2019/10/29(火) 14:52:33.20 ID:spBBwL/I.net] >>460 今の最新の公式リリース
478 名前:デフォルトの名無しさん [2019/10/29(火) 14:56:43.68 ID:spBBwL/I.net] なんかわかりづらくなったので再掲 copy test.txt CONで検証 Windows7、chcp 932・・・text.txt が ShiftJIS だと正しく表示される Windows10、chcp 932・・・text.txt が UTF-8(BOMなし) だと正しく表示される
479 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 16:52:33.42 ID:spBBwL/I.net] なんかいろいろ勘違いしてたっぽい 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)); }
480 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 17:46:22.44 ID:4a4kNF+Q.net] 一つわかった気がする。 コマンドプロンプトはUnicode対応してるけどバッチファイルはUnicode対応じゃないんだ。 (正確にはchcp 65001を実行すれば、UTF-8のバッチファイルを実行できる) だからchcp 932のままコマンドプロンプトでUnicode文字を使うことができるけど バッチファイルにするとそれができない。
481 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 17:46:59.43 ID:wQOUEDyj.net] テキストストリームだけしか通さないから何らかの変換が入ってるのかも知れないね copy /b hoge.txt con 指定されたデバイスに書き込めません。 0 個のファイルをコピーしました。
482 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 18:03:33.66 ID:4a4kNF+Q.net] あ、copyに/bオプションなんてあったのか・・・
483 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 18:10:48.74 ID:4a4kNF+Q.net] そんな馬鹿な・・・。Windows 10でもShiftJISじゃないと表示されなくなっただと? 何度も確認したはずだぞ???
484 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 18:37:30.30 ID:tLCpEMn0.net] 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/
485 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 19:04:08.72 ID:SHkVBveq.net] 少し前にここ
486 名前:ナ同様の話題が有ったが UTF-8(BOM無し) のテキストは たとえ chcp 65001 しても type で一部分文字化けする findstr ^^ foo.txt で正常に表示されるはず(chcp 65001 で) [] [ここ壊れてます]
487 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 19:08:30.96 ID:SHkVBveq.net] あと chcp 65001 しても UTF-8 のバッチは 正常に動作しないと思った方がいい
488 名前:デフォルトの名無しさん [2019/10/29(火) 20:31:39.34 ID:ltL5L5Cn.net] あぁ、クソ。意味がわからんけど、理由がわかった。 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がなにかコマンドプロンプトの状態を変えてやがる。 なんだこれ?コマンドプロンプトに英語モードとかあったっけ?
489 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 20:34:10.83 ID:ltL5L5Cn.net] コマンドプロンプトを起動するのは2の時の間違いな
490 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 20:38:52.72 ID:ltL5L5Cn.net] この話から気づくと思うけど、 powershell -Command [Console]::OutputEncoding 初期状態は、日本語 (シフト JIS) powershell -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8 これでUTF-8に変更して powershell -Command [Console]::OutputEncoding 現在の設定を確認すると、UTF-8になってる。 chcpの値は変わらんのに、コードページを変えることができてしまっているかのようだ。
491 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 21:33:51.82 ID:ltL5L5Cn.net] Windows 7にPowerShell6をインストールしてやってみたけど、 pwsh -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8 で コードページが変わるな。Windows 7はまともに動かないので画面がバグるw
492 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 21:41:58.40 ID:ltL5L5Cn.net] なるほど、SetConsoleOutputCPでコマンドプロンプトのコードページを変更できるらしい tooljp.com/language/C-Languate/sample-code/SetConsoleOutputCP-sample-code.html
493 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 07:47:21.02 ID:WNRoeYsC.net] おれもコードページ弄って色々やったが上手くいかなかった typeは一部ダメ、moreは全くダメ、findstrはリダイレクトするとダメ、 copy〜conは utf-7とjis が一部ダメ、 for〜do echoでやると空行が抜けてダメという具合
494 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 08:50:12.52 ID:BvOaIOcB.net] エディタがあれば必要ない
495 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 11:07:44.00 ID:iT3/p0k9.net] >>476 なんとなく画面に表示する部分にバグがあるから バッチファイル内で閉じて画面に表示しなければ、chcp 65001で動くような気がする。 あとWindows 10ではそこらへんが直ってるので同じように考えるのは早計
496 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 11:25:55.22 ID:iT3/p0k9.net] Windows 7でこれが文字化けせずに動いた chcpで画面はクリアされるが、正しく出力される。 ↓UTF8 + CRLFで作成 @echo off chcp 65001 set A=ユニコード文字 chcp 932 echo %A%
497 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:04:53.93 ID:BvOaIOcB.net] >>262 みたいのは今でも化けるね >>476 はWindows10だと思う どっちにしろ不具合を把握しとくのは大事だね
498 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:11:59.20 ID:n2bLSC2q.net] chcp 65001 にしてもcmd /u で開き直さなきゃバグるんじゃない?
499 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:17:27.39 ID:4eNYSN+t.net] chcpやってモード変更したとしても 既に開いたハンドルは開いたときのモードのままだろうからね
500 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:27:14.70 ID:iT3/p0k9.net] >>480 化けると言うよりか、文字の終わりを正しく認識できてない感じ これならうまくいく。 まずchcpをifの()内でやるとおかしくなる。 その上でsetする文字をダブルクォートでく
501 名前:くらなかったらおかしくなった なのでダブルクォートくくって、出力時に外してる。 @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 [] [ここ壊れてます]
502 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:29:13.59 ID:iT3/p0k9.net] ちなみに >>483 はchcp65001した状態でバッチファイルを実行すれば バッチファイルの中でchcpせずに動く あとファイルの文字コードはUTF8な
503 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:32:44.17 ID:iT3/p0k9.net] >>482 そうとは限らない。 chcpはどうやら内部でSetConsoleOutputCPを呼び出してるんだろうけど SetConsoleOutputCPっていうのはConsole APIの一つで、 コマンドプロンプトのコードページを変更する。 このAPIは子プロセスから親プロセスをたどって見つけた コンソール(コマンドプロンプト)のコードページを変更できる。 ハンドルのモードは関係なく、コンソールのコードページの話
504 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:38:00.67 ID:iT3/p0k9.net] >>252 の改良でこれならうまく動くんだよな ダブルクォートはいるけど。 あとecho あああa みたいに最後をASCII文字にしても動く @echo off chcp 65001 if "hoge"=="hoge" ( echo "あああ" echo "いいい" )
505 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:45:45.44 ID:iT3/p0k9.net] こうすりゃいいのかw @echo off chcp 65001 if "hoge"=="hoge" ( call :echo "あああ" call :echo "いいい" ) exit /b :echo echo %~1
506 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:46:49.70 ID:iT3/p0k9.net] まあバッチファイルでchcp 65001を使うのはやめたほうがいいと思うけど ワークアラウンドでどうにか対応できなくはないかもしれないw
507 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 13:25:11.54 ID:iT3/p0k9.net] 上の方でcmdがだめならPowerShellを使えばいいじゃないみたいなことが書いてあるけど、 UTF8の出力に関しては、コンソールの問題だから Windows 7、8.1 ではPowerShellでもバグるんだよな Windows 7にPowerShell6を入れてみたが、デフォルトで 「あいう」というファイル名が「ああいいうう」と表示される上に [Console]::OutputEncoding = [Text.Encoding]::UTF8 すると 出力できませんみたいなエラーが発生するw つまりWindows 7+PowerShell6だと日本語ファイル名は正しく表示されない 標準搭載のPowerShell 2なら問題ないんだけどね
508 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 13:41:42.20 ID:zJjGNXoj.net] それは >これは、$OutputEncoding が Default だと US-ASCII になっているので、S-JIS 文字列を渡そうとしてもリダイレクト時に日本語がうまく扱えないからです。 >結論から言うと、$OutputEncoding を S-JIS に変更して clip.exe にリダイレクトすれば文字化けしません。 これが関係するのかな?
509 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 13:53:29.35 ID:ecgQNQwo.net] 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)を渡せないのだけれど、 どうしたらいいですか?
510 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 13:53:40.11 ID:iT3/p0k9.net] どこの記事だよw まあググったが。 https://www.vwnet.jp/Windows/PowerShell/CharCode.htm
511 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:08:53.46 ID:iT3/p0k9.net] 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では ?になるのにたいしてこっちは文字化けする
512 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:13:56.47 ID:iT3/p0k9.net] ここはPowerShellのスレじゃないんだがw $OutputEncoding と [Console]::$OutputEncoding は別もんなんか!? [Console]は[Console]::WriteLine とか使うときだけかな?
513 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:16:01.69 ID:n2bLSC2q.net] >>491 "usebackq delims="
514 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:21:07.12 ID:iT3/p0k9.net] [Console]::OutputEncoding と $OutputEncoding の