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/
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 の
515 名前:両方を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 [] [ここ壊れてます]
516 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:22:18.15 ID:iT3/p0k9.net] なぜか書き込みにゴミが入った・・・ ■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
517 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:24:19.49 ID:ecgQNQwo.net] >>495 あら、そんなことだったんだ どうもありがとう
518 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:27:47.60 ID:iT3/p0k9.net] [Console]::OutputEncoding は chcp 相当のことをしていて、 コンソールのコードページを変更しているのに対して、 $OutputEncoding は出力の文字コード変換の制御をしてるっぽい
519 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 14:46:57.29 ID:iT3/p0k9.net] [Text.Encoding]::UTF8 じゃなくて [Text.Encoding]::Unicode を使ってもうまくいく テキスト出力には、ASCII(?)モードとUnicodeモードというのがあるってのはわかってるんだよね https://blog.miz-ar.info/2017/01/wide-stdio-msvcrt/ > Unicode mode はさらに UNICODE モード (_O_WTEXT)、UTF-8 モード (_O_U8TEXT)、 > UTF-16LE モード (_O_U16TEXT) の3つに細分できる んで仮説 [Console]::OutputEncoding は OutputEncoding と書いているけど、 実際にはコンソールのコードページを変更するもので コマンドプロンプトとPowerShellのプロンプト入力の文字コードも変えてしまうから 名前に反して入力にも影響を及ぼしてるんじゃないだろうか? [Console]::OutputEncoding + $OutputEncoding = [Text.Encoding]::UTF8 というのは、つまりプロンプトからの入力をUTF8、出力をUTF8にするという意味 Powershell で文字コードを変更する(clip.exe へのリダイレクトもね) www.vwnet.jp/Windows/PowerShell/CharCode.htm とかは、コンソールのコードページを変更してない=デフォルトのcp932状態で echoしてるから入力がcp932、そしてデフォルトの$OutputEncoding=US-ASCIIで 文字化けするから(入力と同じ)cp932で出力しましょうねって話なんだと思う。 Windows 10以前は、コンソールのコードページ65001にバグが有って 使い物にならなかったけど、Windows 10で修正されたから コードページ65001でコマンドプロンプトもPowerShellも正しく動くようになったんだと思う (ただしこれは画面出力の問題であって、UTF8でバッチファイルを書いた時のパース処理は別の話)
520 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 13:44:45.56 ID:+w7z2z4x.net] https://duckduckgo.com/bang https://duckduckgo.com/bang_lite.html !you "Batch File" !tw バッチファイル !tw "Batch File" !ig BatchFile !r BatchFile !so "Batch File" !gnuk "Batch File" !msd cmd https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/windows-commands
521 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 14:20:34.65 ID:+UvDifof.net] !hatebu バッチファイル !qiita バッチファイル
522 名前:デフォルトの名無しさん [2019/11/03(日) 23:33:41.85 ID:/0rS8sv9.net] 質問なのですが、以下の内容を実行するバッチプログラムを作りたいのですが、どなたかご教示頂けないでしょうか。 Cドライブにある「A、B、C、D」という4つのフォルダとサブフォルダの中身全部を、 Dドライブにある「XXXX」のフォルダの中に存在するフォルダにコピーしたいのですが、コピーする際以下の条件があります。 1.フォルダが1つしかない場合、その中だけにコピーする。 2.フォルダが複数ある場合は、それぞれのフォルダに1.と同様にコピーする。 宜しくお願いします。
523 名前:デフォルトの名無しさん mailto:sage [2019/11/03(日) 23:37:03.86 ID:Xh3slsXc.net] >>503 自分で作ってください
524 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 09:25:52.62 ID:0uHh5Wp4.net] 宜しくお願いします。と書けば誰かがやってくれるとでも? xcopy robocopy move for if set call dir findstr この辺使えりゃ出来るから自分で調べろ "バッチ バックアップ" とかでググれば腐るほど例が出るだろ
525 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 13:01:25.95 ID:Zu03xGz4.net] >>493-500 Ruby で、クリップボード内の複数行文字列の、各行の先頭・末尾から、 連続する空白類を除去して、クリップボードに入れる str = `powershell Get-Clipboard` str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換 ary = str.each_line.map( &:strip ) # 連続する空白類を除去する IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す clip.print( ary.join "\n" ) end >>503 そんな複雑な条件を、バッチでプログラミングするのは無理! Ruby などのプログラミングで、再帰的にコピーするか、 PowerShell で、robocopy を使うとか
526 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 13:46:43.19 ID:UHaJ6Kuw.net] > Ruby で、クリップボード内の複数行文字列の、各行の先頭・末尾から、 > str = `powershell Get-Clipboard` Rubyでできないなら、もう全部powershellで書いちゃえよw
527 名前:506 mailto:sage [2019/11/04(月) 15:48:40.94 ID:Zu03xGz4.net] >>503 Ruby で作った。 FileUtils::DryRun では、実際には実行しない require 'fileutils' src_dirs = [ "C:/Users/Owner/Documents/A/", "C:/Users/Owner/Documents/test/B/" ] target_dir = "D:/何々/*" # target の子フォルダの配列 dest_dirs = Dir.glob( target_dir ).select { |path| File.directory?( path ) } return if dest_dirs.length == 0 # フォルダが存在しない src_dirs.each do |src_dir| # 2重ループ dest_dirs.each do |dest_dir| FileUtils::DryRun.cp_r( src_dir, dest_dir ) end end
528 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 22:13:40.62 ID:mdzUzifN.net] >>505 >>508 有難うございます。 それらでググって調べてやってみます。
529 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 12:51:32.26 ID:3/4kxzup.net] >>509 参考にどうぞ @echo off set s="C:\" set d="D:\XXXX" cd/d %s% for %%i in (A B C D) do call :x "%%~fi" "%%~i" pause & exit/b :x pushd %d% for /d %%j in (*) do xcopy /e /i %1 "%%~j"\%2 popd
530 名前:デフォルトの名無しさん [2019/11/05(火) 18:52:56.56 ID:ykrQtfUP.net] >>510 そんな複雑なことをしなくても、@echo offを除いて1行で書けるだろ。 @echo off for %%s in (A, B, C, D) do for /d %%d in (D:\XXXX\*) do xcopy "C:\%%s" "%%d\%%s" /e /i
531 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 20:10:31.32 ID:3/4kxzup.net] 多分 %%~fd やね
532 名前:デフォルトの名無しさん [2019/11/05(火) 20:28:07.61 ID:ykrQtfUP.net] %%dだけでフルパスになるから~fは不要。
533 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 20:42:07.32 ID:3/4kxzup.net] そうか失礼いたしました
534 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 20:50:46.27 ID:kqXSHliE.net] 火【22】義母と娘ブルース 11.5__11.3__12.4__12.2__13.1__13.9__15.1__15.5__17.3__19.2(終)________14.15 これはドラマ視聴率のデータですがコマンドプロンプトで値を入力していって、 その時点での相加平均値を表示してくれるバッチファイルってできますか? INPUTを使うのかな あと、ウィンドウを開いている間生きている変数ってファイルへの格納、取り出しって そんな面倒なことしてるなら表計算ソフトでも使えってか
535 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 21:30:33.42 ID:HPnxYMOW.net] >>515 出来なくはないけれど set /a では整数しか扱えずバッチのみでやるのは面倒 やるならPowerShell とか wsh, js かな 単に平均出すだけなら電卓アプリの方が楽
536 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 22:38:05.69 ID:aoMnc07l.net] Dim str str ="" Dim num Dim ans Dim bln_Confirm Function main() str = InputBox("数値を入力",,str) If instr(str,"_") Then ans = Eval("(" & Replace(str,"_","+") & ")/" & UBound(split(str,"_"))+1) else ans = Eval(str) End If bln_Confirm = MsgBox("入力数値:" & str & vblf & vblf & "入力の平均:" & ans,3,"続ける?") str = str & "_" End Function Do main Loop While bln_Confirm = vbYes VBSならこうかな?
537 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 01:50:43.91 ID:ZR40S1lI.net] Ruby で作った。 最後の(終) の部分は、数字とみなされないので、無視される str = "11.5__11.3__12.4__12.2__13.1__13.9__15.1__15.5__17.3__19.2(終)" ary = str.split( "__" ) # 数字部分を配列に入れる ary.map!( &:to_f ) # 文字列を浮動小数点へ変換する p ary.inject( :+ ) / ary.length # 合計 / 要素数
538 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 03:37:02 ID:sEBZ5Hrs.net] スレタイも読めないメクラか? ドヤりたいなら該当スレへ逝け
539 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 15:19:13.85 ID:Z1XrM+Fl.net] :ALCL @echo off &setlocal enabledelayedexpansion echo 少数切り捨て。少数以下は求めたい桁数まで0埋めして入力 echo 少数2位まで求めたい場合 ex: 12.4 -^> 1240 echo 00で Clear, 000で AllClear set i= :LOOP set /a i+=1 :INPUT set /p N%i%=数値を入力 : echo !N%i%!|findstr /r /c:"[^0-9]" && (echo 入力無効 &goto :INPUT) if !N%i%!==000 goto :ALCL if !N%i%!==00 ( if %i% leq 2 goto :ALCL if %i% gtr 2 set /a i-=2 ) set s= set r= for /l %%a in (1,1,%i%) do ( set s=!s! !N%%a! set /a r+=!N%%a! ) set /a r/=%i% echo %s% : %r% goto :LOOP
540 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 15:48:22.56 ID:Z1XrM+Fl.net] set /p N%i%=数値を入力 : if not defined N%i% (echo 入力無効 &goto :INPUT) echo !N%i%!|findstr /r /c:"[^0-9]" && (echo 入力無効 &goto :INPUT) 上のに真ん中の行追加で
541 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 20:50:16.92 ID:wTTuQQRz.net] バッチファイルは難しすぎ! 引数の概念がLinuxと全く違う
542 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 23:04:29.95 ID:wTTuQQRz.net] 空白が入ったパスをバッチファイルにわたすために ダブルクォートで括らないといけないが、 それをやると、変数にダブルクォートが入るのがクソなんだな しかも、if "%1" == "" とか書くと、引数がダブルクォート 一個だったときにエラーが出るとかいろいろ破綻してる
543 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 01:48:00 ID:4r3ojeSB.net] >>522 難しすぎというよりは適当仕様すぎ 仕様を安易に何回も拡張した、増築して迷路化した老舗旅館
544 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 04:42:48.88 ID:nSoHFrko.net] >>511 @for %%s 以下略じゃダメなの?
545 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 06:29:37.44 ID:lb8cogBR.net] >>525 それならdoの後のforとxcopyにも@付けろ 何でも一行にすりゃいいわけじゃないがな
546 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 06:59:41.26 ID:LFqMQC4+.net] >>523 %~1で外せるでしょ?
547 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 07:54:19.69 ID:isVFtAa0.net] >>520 さんありがとうございます ”これこそが私の求めていたものだ” そんな慣用句?ローマの名文句?ってあったっけと思ってしまいますた。 000と00の入力処理で使いやすくなっているのがセンスというか実際の使用を考えた親切な仕様だなと思います。 訂正できるのは本当に便利だ。 VBSとRubyで書いてくださった>>517 さんと>>518 さんにも感謝。 自分の要求仕様がどう解釈・解決されるの
548 名前:か勉強になります。 [] [ここ壊れてます]
549 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 09:58:22.71 ID:d6TMJd25.net] >>528 冗談で書いたんだが。。これなら同様のアプリ探した方がいいんじゃない? あと以下修正、>>521 部分も含む :INPUT set N%i%= set /p N%i%=数値を入力 : if not defined N%i% (echo 入力無効 &goto :INPUT) echo !N%i%!|findstr /r /c:"[^0-9]" && (echo 入力無効 &goto :INPUT) Clear後に空入力繰り返すと消したのが戻ってまたClearしてと繰り返す挙動が直る 実害無いだろうから敢えてそのままにするのも有り 既存の環境変数に set /p で空入力しても 空で上書き初期化されずそのまま残るみたい
550 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 10:37:33.42 ID:sEmiRyTj.net] >>527 どこ見てもその程度。みんな適当なんだよな。 まず最初に書いた例から。バッチファイル(test.bat)を 1.このように書いた時 if "%1" == "" echo 引数なし > test.bat " コマンドの構文が誤っています。 2.このように書いた時 if "%~1" == "" echo 引数なし > test.bat " 引数なし ※↑間違い。「"」という引数があります。 3. このように書いた時 if %~1 == "" echo 引数なし > test.bat " echo の使い方が誤っています。
551 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 12:19:13.92 ID:Z6Qb1qTa.net] Windowsバッチの仕様がダメダメというのはそのとおりだが、 引数が " だけというのは、かなり特殊な想定だよな。 これが大丈夫という言語ってあるのか? この場合とは違うが、外部アプリから""でくくったパスなどを渡してもらうときは、 アプリの方で、\"〜\"で吐き出すように設定して、 バッチファイルで、この\を削除するようにすることで、 引数展開でおかしな動作をさせないようにしている。 e.g. fxのOpenWithアドオンなど
552 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 12:32:04.92 ID:sEmiRyTj.net] >>531 言語関係ない。コマンドプロンプトの仕様だから 例えばechoでダブルクォートだけを出力したいなら echo " と書くしか無い。 PowerShellとかコマンドプロンプトを使わないなら 閉じてないダブルクォートの扱いを変えることは可能だが、 コマンドプロンプトはもうどうしようもないw そしてこれ(もともとはMS-DOSの仕様)を前提に Windows版のC言語とかのCRTライブラリが作られ、 mainに渡る前に、そういう文字列を解釈するようになってる。
553 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 12:33:31.15 ID:sEmiRyTj.net] > この場合とは違うが、外部アプリから""でくくったパスなどを渡してもらうときは、 > アプリの方で、\"〜\"で吐き出すように設定して、 いきあたりばったりなんだよなw 本当にここらへんの奴らは適当
554 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 12:40:37.56 ID:sEmiRyTj.net] https://thinca.hate nablog.com/entry/20100210/1265813598 \ は、 ダブルクォートの内外を問わず、" の前に \ を前置すると " 自身を表現できる。 \\" とすると \" の \ をエスケープしたことになり、 \" になる。この " は特殊文字である。 \\\" とすると \\ + \" になり、 \" になる。この " は " 文字自身である。 以下、\ が増える度に上記のようなエスケープを繰り返す。 \\\\" → \\" (" は特殊文字) \\\\\" → \\" (" は通常文字) 上記以外の場所にある \、つまり後に " が続かない \ は、いくつ重なっていてもその文字自身になる。
555 名前:デフォルトの名無しさん [2019/11/07(木) 12:53:05.11 ID:LDERshfw.net] >>528 バッチ/シェルスクリプトは、複雑なプログラミングをするものじゃない! Ruby, PowerShell, VBScript などを使うべき まず、データの仕様を作るべき。 その程度のデータなら、普通は、CSV 形式とか 1. どこかのサイトから、データの集積物を取得する 2. それをパースして、CSV 形式に変換する 一旦、CSV へ変換すれば、 その後は、Rubyなど、様々なプログラミング言語で処理できる 1の部分は、Ruby, Selenium WebDriver などで、クローラー・スクレイピングも出来る
556 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 12:58:16.29 ID:lb8cogBR.net] >>531 まったくスレチだけどG
557 名前:nuPGのパスワードを思い出した 引用符だけのパスワードを渡す場合は pass " >gpg -c --passphrase ^""" hoge.txt pass "" >gpg -c --passphrase """""" hoge.txt pass """ >gpg -c --passphrase ^""""""""" hoge.txt 何でこうなるかは知らんがGnuPGだけの話さ コマンド側でどう引数処理するかだよな バッチでは普通ダメだね [] [ここ壊れてます]
558 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 13:04:39.19 ID:sEmiRyTj.net] ダブルクォートを"""と3個やっても動かないときは、 """" に増やして動くか """"" に増やして動くか """"" に増やして動くか これぐらいまで試す あるある
559 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 13:26:56.23 ID:Z6Qb1qTa.net] >>536 クォートの先頭にエスケープが必要な場合でも、 後ろの方は何故かエスケープが不要なことがあるんだよな。 *nix系から移植したプログラムで、こういう事がたまに起きる。 いずれにしても、謎仕様…
560 名前:デフォルトの名無しさん mailto:sage [2019/11/08(金) 05:39:07.91 ID:78hADO4V.net] set x=echo %x% qqq set a=y set %a%=3 echo %y% どちらもできた
561 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 12:37:18.78 ID:9Z+ynpem.net] もう無理だw if "%value%" == "" echo match こんな感じのコードで、%value% にどんな文字 (ダブルクオート、スペース、カンマ、その他記号)が 入っていてもエラーにならないというコードを バッチファイルで書くのは不可能だw お手上げ\(-o-)/
562 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 12:55:41.49 ID:hmJLHo7y.net] IF NOT DEFINED VALUE
563 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 13:02:21.70 ID:9HGwW/1Y.net] >>541 あ、ごめん。実際は右側、値が入ってる。 if "%value%" == "abc" echo match
564 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 13:03:25.05 ID:hmJLHo7y.net] setlocal enabledelayedexpansion if "!value!"=="abc" echo match endlocal
565 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 13:14:34.88 ID:9HGwW/1Y.net] あれ?マジで?それだけでいけちゃうの?
566 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 13:22:47.16 ID:hmJLHo7y.net] これな、"abc"の方が要注意なんよ ^とか!とか入ってるとやばいかも setlocalの前に代入して if !a!==!b! とかやった方がええかもな
567 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 13:53:03.27 ID:9HGwW/1Y.net] >>545 右側、固定値なら大丈夫だよね?
568 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 14:00:20.08 ID:hmJLHo7y.net] うん多分、変な文字入って無けりゃね 遅延モードだと全角文字のリテラルにも一部副作用が有るかも
569 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 14:07:53.35 ID:9HGwW/1Y.net] なんだよ、全角文字の副作用って・・・ せっかく進んだのにw
570 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 14:15:55.11 ID:hmJLHo7y.net] setlocalの外で代入すりゃ問題ない 遅延の中では書くな あと、if !a!==!b! に " はたぶん不要
571 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 14:26:55.47 ID:9HGwW/1Y.net] setlocalの中で代入するとなにか問題があるのか・・・
572 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 14:37:46.76 ID:hmJLHo7y.net] ええと setlocal enabledelayedexpansion 〜 endlocal の中だよ
573 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 15:15:35.38 ID:hmJLHo7y.net] >>550 すまん。おれの勘違いだった 全角文字は関係無かった。無視してください でも^や!は要注意だけど
574 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 17:06:16.41 ID:hmJLHo7y.net] でもif文自体が挙動不審だからなあ if "ーー"=="""" echo 同じ
575 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 20:49:07.09 ID:9HGwW/1Y.net] >>553 ShiftJISだとだめだけど、バッチファイルをUTF8で保存したら大丈だったよ! ただし、それでも引数で渡すとダメだったけどwww
576 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 20:57:33.36 ID:9HGwW/1Y.net] >>553 それも enabledelayedexpansion 使えば大丈夫じゃない? setlocal enabledelayedexpansion set A=%1 if !A! == "" echo 同じ もうやだこの言語(?)
577 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 21:14:31.85 ID:9HGwW/1Y.net] @echo off echo %1 call :LABEL %1 exit /b :LABEL echo %* ↓ > test.bat a a a これが普通 > test.bat ^^ call :LABEL exit /b ECHO は <OFF> です。 頭痛いけどなんとなく理解できる > test.bat "^" "^" "^^" なんで^増えてんだよwww
578 名前:デフォルトの名無しさん mailto:sage [2019/11/09(土) 21:24:41.89 ID:9HGwW/1Y.net] @echo off setlocal enabledelayedexpansion echo %1 set A=%1 call :LABEL "%A%" call :LABEL !A! call :LABEL "!A!" exit /b :LABEL echo %1 > test.bat "^" "^" """" "^^" """" もう意味がわかんないw これ人間が制御できるものなんか?
579 名前:デフォルトの名無しさん mailto:sage [2019/11/10(日) 09:44:25.06 ID:fP398yW4.net] setlocal enabledelayedexpansion は >>540 対策で使えるけど、 それ以外はもっと制御が難しいかも・・・ 基本は通常のsetlocalで比較のときだけ 部分的に使ったほうが良さそう 今回は頑張ったけど、もうやらない。
580 名前:デフォルトの名無しさん mailto:sage [2019/11/10(日) 15:37:42.63 ID:noq81T2Q.net] スレ伸びてると思ったらほぼ ID:9HGwW/1Y だったでござる
581 名前:デフォルトの名無しさん mailto:sage [2019/11/10(日) 20:23:39.65 ID:u8+xJCBj.net] for in って for %%i in (*) みたいにワイルドカードが含まれていればファイルを検索する機能で for %%i in (a b c) みたいにワイルドカードが含まれてない場合は ファイルがあるなしに関係なく、a、b、cを繰り返す機能ってことであってますか?
582 名前:デフォルトの名無しさん mailto:sage [2019/11/14(木) 15:51:47.87 ID:MT98n7t2.net] 多重フォルダの中身を 一番上のフォルダにまとめるスクリプトってどうやるの? できればフォルダをドラッグ&ドロップしたいんだけど