1 名前:デフォルトの名無しさん mailto:sage [2011/02/28(月) 15:12:30.34 ] 拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる 質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。 ※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。 前スレ 【.cmd】 バッチファイルスクリプト %6 【.bat】 hibari.2ch.net/test/read.cgi/tech/1277465356/ 【.cmd】 バッチファイルスクリプト %5 【.bat】 pc12.2ch.net/test/read.cgi/tech/1242268171/ 【.cmd】 バッチファイルスクリプト %4 【.bat】 pc12.2ch.net/test/read.cgi/tech/1229955189/ 【.cmd】 バッチファイルスクリプト %3 【.bat】 pc11.2ch.net/test/read.cgi/tech/1217860043/ 【.cmd】 バッチファイルスクリプト %2 【.bat】 pc12.2ch.net/test/read.cgi/tech/1197881068/ 【.cmd】 バッチファイルスクリプト %1 【.bat】 pc11.2ch.net/test/read.cgi/tech/1178281991/
11 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 18:43:49.59 ] 実際に使用していて有名なのはautoexec.batじゃね? コンベンショナルメモリを無駄にしないためにはconfig.sysだけじゃなく autoexec.batも理解しないと意味ないしね
12 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 19:13:40.65 ] ググってヒットするサンプル集って けっこう実用的だと思うのはおれだけか
13 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 20:13:54.94 ] 誰かバッチで標準入力から入力得る方法おしえてくらさい 以前自分が調べたやつから とりあえず基本 for文 FOR %%B IN (*.TXT) DO TYPE %%B if文 IF %FLG%==1 DIR REM コメントだこの野郎 GOTO相当 :START ECHO そして時は繰り返す GOTO START とりあえずチューリング完全
14 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 20:26:10.53 ] イミフ
15 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 21:58:57.14 ] うちのautoexec.batは空っぽだから実用的じゃねえ 昔のautoexec.batもそれ以外に使い道ないからちっとも実用的じゃねえ 単なる阿呆だなw>>11
16 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 22:00:52.09 ] >>13 set /p x=なんか入れろぼけ
17 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 10:23:29.57 ] バッチファイルを使い続けて20年 ついに奥義遅延展開を会得したぜ
18 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 10:50:06.67 ] >>17 @echo off setlocal enabledelayedexpansion set 1=お set 2=め set 3=で set 4=と set 5=う for /l %%a in (1,1,5) do echo !%%a! endlocal exit
19 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 16:50:01.75 ] 遅延会得者に拍手w
20 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 17:50:45.23 ] 遅延展開より、むしろ、華麗な CALL 使いの方に憧れる ここの前スレだったか、別板スレの前スレだったかはとても勉強になったよ でも会得してないので遅延展開使っちゃうけどw
21 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 18:28:47.78 ] >>20 どういうの?
22 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 18:43:43.50 ] こういうの @echo off setlocal set 1=お set 2=め set 3=で set 4=と set 5=う for /l %%a in (1,1,5) do call echo %%%%a%% endlocal
23 名前:20 mailto:sage [2011/03/08(火) 19:04:57.04 ] そうそう、そいうの call echo %%%%a%% というようなの知らなかったからインパクト大きかった その後ググってたら d.hatena.ne.jp/jak-san/20090308/1236501217 見つけて世界が広がった感じ 他にも目からウロコがいくつかあったけど思い出せないw
24 名前:21 mailto:sage [2011/03/08(火) 20:10:08.46 ] >>22 >>23 すげえええええ call使えばもう1段階変数が外せるのか てかcallの処理ってこんな風になってたんだね まさに目から鱗だ でも少し見にくいからやはり遅延展開!!の方が見やすいかも・・・
25 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 20:38:42.71 ] これが初出かな 2005-03-10 ttp://otnx.jp/CMD/コマンド別/call/
26 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 20:47:40.50 ] こっちが早いかな ttp://d.hatena.ne.jp/otn/20040227
27 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 20:57:08.22 ] バッチファイルでFizzBuzzをお願い
28 名前:デフォルトの名無しさん [2011/03/08(火) 21:35:00.23 ] バッチでBroken pipeってエラーが大量に出るんですが、これなんでしょうか? 引き渡してるパラメータはログ主力すると、正しく渡されてるようです。
29 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 22:33:31.13 ] setlocal enabledelayedexpansion set o=me set me=de set de=to set to=u set u=おめでとう for /f %%A in ( 'call echo %%!%o%!%%' ) do call echo %%!%%A!%% endlocal
30 名前:デフォルトの名無しさん mailto:sage [2011/03/08(火) 23:30:00.51 ] >>28 windowsでBroken pipeなんて出るの? まぁ、文字通りパイプが壊れてるんじゃないの? オプションって言うよりは、入出力関係で不正な操作が起きるんじゃない?
31 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 02:30:08.73 ] >>29 バッチを読んでみた。 とりあえずバッチファイルを実行してみた、結果が表示された。 もう一度バッチを読み直してみた。 もう君がなにをしているのか訳がわからないよ。
32 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 04:52:28.96 ] setlocal enabledelayedexpansion set o=me set me=de set de=to set to=u set u=omedetou set omedetou=^^^>^^^>31 説明しても良いが、何故かもう一回展開できてしまって、この理由が全く説明できないから、展開されるタイミングとか勘違いしてるかもしれんが良いか? for /f %%A in ( 'call echo %%%%!%o%!%%%%' ) do call echo %%!%%A!%% endlocal
33 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 05:06:07.95 ] あれ…? 何か勘違いしてた… 説明できるかもしれんけど、もう少し良く考えてみる
34 名前:デフォルトの名無しさん [2011/03/09(水) 07:00:45.31 ] >>30 windowsででちゃってます。入出力関係が問題ですか。 複数のバッチを同時起動してるのが、まずいのかもしれません。 標準入力とか使い回ししてるのかもしれないですね。
35 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 07:14:09.84 ] >>34 何か変なコマンド呼んでない? 複数起動禁止でスレッドセーフじゃないコマンドとか、そんなパターンじゃないかと…
36 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 09:31:03.77 ] UNIXだとbroken pipeは受け側のプロセスが先に終了して、向こう側が 閉じたパイプに書き込もうとしたときのエラー。 Windowsでも同じ状態をいうんじゃないのか?
37 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 21:01:22.97 ] >>32 %for /f %A in ( 'call echo %%!me!%%' ) do call echo %!%A!% !for /f %A in ( 'call echo %%de%%' ) do call echo %!%A!% call echo %%de%% echo %to% %A=u %call echo %!u!% !call echo %omedetou% %echo ^>^>31 >>31 for /f %%A in ( 'call echo %%%%%%!%o%!%%%%%%' ) do call echo %%!%%A!%% %for /f %A in ( 'call echo %%%!me!%%%' ) do call echo %!%A!% !for /f %A in ( 'call echo %%%de%%%' ) do call echo %!%A!% call echo %%%de%%% echo %%to%% %A=%u% %call echo %!%u%!% for /f %%A in ( 'call echo %%%%%%%%!%o%!%%%%%%%%' ) do call echo %%!%%A!%% %for /f %A in ( 'call echo %%%%!me!%%%%' ) do call echo %!%A!% %call echo %!%%u%%!% cmd /c call echo %%de%% to cmd /c call echo %%%de%%% u
38 名前:37 mailto:sage [2011/03/09(水) 21:05:17.09 ] >>37 の結果から推察すると for /f in ('') のコマンドの処理は単純に cmd /c と同じではなくて %%→% の処理はされずに %環境変数の展開はされる。 ってことで合ってる?
39 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 21:16:29.06 ] はぁ?
40 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 21:18:32.94 ] %%→% はバッチだけだろ cmdの標準入力やコマンドラインは違うだろ
41 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 21:33:13.64 ] よくそんなんでやってきたな 表面的にしか理解していない証拠
42 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 21:43:06.29 ] そんなんでだめな証拠をみせろや
43 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 21:53:28.63 ] >>40 なるほど、コマンドプロンプトで試してみたら call echo %%de%% u call echo %%%de%%% %u% となったから>>37 と一致したよ バッチではなくコマンドプロンプトでしてる時と同じ処理になるってことなのか。 ありがとう。 >>39 ,>>41 そんな煽るだけの誰の役にも立たないクソレスしかつけられないなんて かわいそうな子なんですね。
44 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 22:11:49.57 ] >>16 今更ながら気づいた。こういうことか @echo off setlocal enabledelayedexpansion set /p mo=あ、そう。打ちたいなら何か打てば? echo !%mo! endlocal exit /b
45 名前:デフォルトの名無しさん mailto:sage [2011/03/09(水) 22:13:30.35 ] >>43 んじゃ、このバッチで復習を setlocal enabledelayedexpansion set o=me set me=de set de=to set to=u set u=omedetou set omedetou=おめでとう for /f %%A in ( 'call echo %%^^^!%%%%!%o%!%%%%^^^!%%' ) do call echo %%A endlocal
46 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 10:15:12.01 ] 質問です。 下記のバッチですが、if 文の条件に合わないのに、 なぜか変数 a の値が変わります。なぜでしょうか? @echo off set a="ー" echo BEFORE=%a% if %a%%a% == """""" set a="X" echo AFTER=%a% pause 2行目で変数に "ー" 以外を代入すると、値は変わりません。 "ー" はバッチ変数のダメ文字なんでしょうか?
47 名前:46 mailto:sage [2011/03/10(木) 10:27:51.06 ] >>46 をブラウザからコピペしてバッチファイルを作成したら動作しませんでした。 set a="ー" の末尾のスペースを削除したら動作しました。 もう、さっぱり分かりません。
48 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 10:52:15.87 ] エスケープ文字とか確認してみた?
49 名前:46 mailto:sage [2011/03/10(木) 11:19:55.02 ] ありがとうございます! set a="^ー" にしたら正常に動きました。 なぜか末尾に半角スペースはダメなようです。 "ー"以外にもエスケープが必要な文字あるんでしょうかね。 実際は変数に何の文字が入るか分からないので、 全部エスケープすりゃいいのかな。 全角文字はやばいのかも。
50 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 12:30:25.19 ] どんだけ半角スペース入るのかわからんけど forのdelimsとかtokensとか使ってみたらどう?
51 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 12:36:43.13 ] " "の中でが^はエスケープにならないけどね
52 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 12:39:50.02 ] そもそも"がエスケープだからな
53 名前:46 mailto:sage [2011/03/10(木) 12:51:26.32 ] >>50 半角スペース1個ですよ。 IE とかでレスをコピペしたら付くよ。 >>51 、>>52 普通そうですよね。 では set a="^ー" で正常に動いた理由は?
54 名前:46 mailto:sage [2011/03/10(木) 12:55:51.56 ] というか ^ じゃなくても同じだなw また、分からなくなってきた。
55 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 13:17:15.56 ] if文ではーと"が同一視されるとか
56 名前:46 mailto:sage [2011/03/10(木) 14:19:31.45 ] "―" でも同じようだ。 if "―""―" == """""" echo 等しい 等しい だめだこりゃ
57 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 19:19:48.87 ] if aaaaa == a―a―a echo 等しい 等しい "とか^とか全然関係ないじゃん。 要するにif文の比較には駄目文字が存在するって事で。 ーと―は駄目だね。
58 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 19:35:38.13 ] if aーaーa == aaaaa echo bug
59 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 19:58:41.01 ] if aab==aーb echo x
60 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 20:37:35.38 ] バッチを直接使わずに自身を引数にWSHに渡すやり方が便利だ。 だがWSHはWindows 7だとデフォルトでは無効なんだっけか。 PowerShellを覚えなきゃいかんのかなぁ。
61 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 21:58:30.78 ] 同左ってことですね
62 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 22:31:24.41 ] そうさ
63 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 23:02:31.39 ] なんでそうなってる? 外人さんにとって、横線は同左なのか?
64 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 23:10:43.82 ] ttp://support.microsoft.com/kb/414445/ja
65 名前:sage [2011/03/10(木) 23:16:28.91 ] telnet通信越しにバッチを実行数と、たまに標準エラー出力に実行したコマンドが、 まるまる表示されるときがあるんですが、これなんですかね? バッチの動作は正しいんですが、気持ち悪いです。
66 名前:デフォルトの名無しさん mailto:sage [2011/03/10(木) 23:44:27.22 ] つまり"コピー"が"コピピ"と同等なのかw 迷惑な仕様だな
67 名前:デフォルトの名無しさん mailto:sage [2011/03/11(金) 01:28:50.41 ] >>64 この問題とは違う気がする この事例だと"コピー"は"コピ?"となってーはワイルドカードみたいになるってこと?それか正規表現? >>58 >>59 見ると正規表現っぽいけど
68 名前:デフォルトの名無しさん mailto:sage [2011/03/11(金) 03:53:26.02 ] 「同左」文字の一覧
69 名前:デフォルトの名無しさん mailto:sage [2011/03/11(金) 06:42:21.93 ] 半角カタカナの"ー"も同じっぽいけどね
70 名前:デフォルトの名無しさん mailto:sage [2011/03/11(金) 08:28:01.29 ] if ゞ==々 echo ゞ=々 if not "ゞ"=="々" echo "ゞ"≠"々"
71 名前:デフォルトの名無しさん mailto:sage [2011/03/11(金) 11:26:30.13 ] あはは
72 名前:sage [2011/03/12(土) 12:29:23.18 ] Linuxでsyncに該当するコマンドってあります?
73 名前:デフォルトの名無しさん mailto:sage [2011/03/12(土) 14:08:30.15 ] >>72 sync
74 名前:デフォルトの名無しさん mailto:sage [2011/03/12(土) 16:45:25.01 ] if あはは==あは々 echo あはは==あは々
75 名前:デフォルトの名無しさん [2011/03/13(日) 12:13:23.68 ] >73 失礼しました。 Linuxでのsyncに該当するコマンドがwindowsであります?です。
76 名前:デフォルトの名無しさん mailto:sage [2011/03/13(日) 12:34:12.10 ] ハードウェアの安全な取り外し?
77 名前:デフォルトの名無しさん mailto:sage [2011/03/13(日) 12:53:26.18 ] >>75 technet.microsoft.com/en-us/sysinternals/bb897438.aspx
78 名前:デフォルトの名無しさん [2011/03/13(日) 21:27:59.41 ] >>77 まさにこれを探してました。ありがとうございます。
79 名前:デフォルトの名無しさん mailto:sage [2011/03/13(日) 23:59:38.64 ] IF文の変数の比較判定は、思わぬ落し穴がある set a="b==c" if not %a%==%a% echo NOT EQUAL !!
80 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 15:01:05.89 ] どこが? おまえだけw
81 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 16:24:57.67 ] set a="b==c" if %a%==%a% echo EQUAL !! だけど?
82 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 17:47:04.60 ] ふーん。環境により変わるのか? 教えてくれ>>80 の先生
83 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 19:18:01.59 ] 俺は Win2kSP4 だが 何度やっても NOT EQUAL !! って表示されるな 古い cmd.exe のバグかね?
84 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 20:04:46.64 ] >79 ウチのWinXP(SP3)では何も表示されないな。 ついでに「 echo %a% 」を次の行に追加した場合は「 "b==c" 」と表示された。
85 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 20:13:45.30 ] 今、XPのcmd.exeを拾ってきて試した 変数の展開が微妙に違うなw win2k >if not "b == c"=="b==c" echo NOT EQUAL !! NOT EQUAL !! winXP >if not "b==c" == "b==c" echo NOT EQUAL !!
86 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 20:31:25.66 ] >>85 2kだと == が "" でエスケープされずに最初の == が比較演算子と認識されてるのかな? スペースの付き方の違いをみるとそう受けとれる 2kの cmd.exe は for にもバグがあるみたいだし結構ずさんなバグが他にもあるのかも otnx.jp/CMD/%A5%D0%A5%B0/
87 名前:デフォルトの名無しさん mailto:sage [2011/03/14(月) 21:54:24.82 ] >2kだと == が "" でエスケープされずに最初の == が比較演算子と認識されてるのかな? >スペースの付き方の違いをみるとそう受けとれる もしそうならあとがコマンドとして実行されてエラーになるだろ?
88 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 00:50:09.59 ] win2k は "b と c"=="b==c" を 比較して echo してる
89 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 01:27:18.63 ] win2kのバグ付きcmd.exeで動くバッチw @echo off set b=それは ^^" です。 set c=それは ^^" ではありません。 :x set a= set /p a=文字= if "%a%==%a%" ( echo %b% ) else echo %c% goto x
90 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 01:30:48.75 ] >>86-88 それなら「c"」までがif文となり、その後の「=="b==c" echo NOT EQUAL !!」 が、実行されてエラーになるんジャマイカ?
91 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 01:41:19.03 ] 「"b == c"=="b==c"」の全体の「"」が外されて not「b」==「c"=="b==c」と解釈してると予想
92 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 01:50:38.93 ] バグってるソフトが、正常なエラーを出すかよw
93 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 01:55:32.05 ] >>91 それだと>>89 は動かない
94 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 05:10:10.83 ] >>93 手元に2000無いから分からんが、どう動くの?
95 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 07:48:06.63 ] 文字=z >if "z == z" (echo それは " です。 ) else echo それは " ではありません。 それは " ではありません。 文字=" >if "" == "" (echo それは " です。 ) else echo それは " ではありません。 それは " です。
96 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 08:45:46.87 ] win2kのcommand.comもバグってるようだ
97 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 11:37:36.79 ] >>95 その結果だけみるとダブルクォーテーションでエスケープ出来ない感じ?
98 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 13:11:59.49 ] " は == に対しては何の効果もない。 " が奇数個だとまずい。 " も比較の対象。
99 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 17:17:41.23 ] 2kなんかどうでもいいんだけど
100 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 18:48:54.30 ] Win2000のユーザはまだ多数いると思うぞ
101 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 22:03:56.89 ] MSですらサポートやめたOSにまで対応するのは愚かだよ
102 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 22:26:00.31 ] 2kなんかどうでもいいからサポート中のOSだけでも直してほしいな
103 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 22:41:15.80 ] 何を?
104 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:00:36.57 ] >>101 愚かだね。誰もそんな要求してないけど。
105 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:08:44.93 ] >>103 cmd.exeバグだらけなんだけど
106 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:14:38.46 ] ここにそんな事を書いても無駄
107 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:25:37.56 ] どこかに書けば直すとでも?
108 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:30:59.08 ] 否。でも無駄には変わりない。
109 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:37:12.84 ] だからなに?
110 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:41:30.73 ] >>106 >>108 ここにそんな事を書いても無駄
111 名前:デフォルトの名無しさん mailto:sage [2011/03/15(火) 23:48:08.15 ] そうですねw