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/
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
112 名前:デフォルトの名無しさん mailto:sage [2011/03/16(水) 01:49:08.39 ] おまえ誰?
113 名前:デフォルトの名無しさん mailto:sage [2011/03/16(水) 09:27:16.44 ] \ / \ 丶 i. | / ./ / \ ヽ i. .| / / / \ ヽ i | / / / \ た わ し で す -‐ ー __ __VV >:::::::::::::::::::: < _>':::::::: ::::::::< ,>'::::: ::::::::< >::::::: :::::::::< >;;::::: :::::::< >i::::::::::::::ゞ< 'ヘトハト! ‐- / / ヽ \ / 丶 \ / / / | i, 丶 \ / / / | i, 丶 \
114 名前:デフォルトの名無しさん mailto:sage [2011/03/16(水) 10:57:44.78 ] なんか面白いネタを頼む。愚痴は要らん
115 名前:デフォルトの名無しさん [2011/03/16(水) 23:32:55.60 ] 標準出力や、標準エラーを初期化する方法ってあります? 初期化って概念が、そもそも無いかもしれないですが。
116 名前:デフォルトの名無しさん mailto:sage [2011/03/17(木) 01:18:24.11 ] >標準出力 2>標準エラー
117 名前:デフォルトの名無しさん mailto:sage [2011/03/17(木) 15:43:02.49 ] >>115 初期化しないと生ずる不具合を教えてください 具体的にお願いします
118 名前:デフォルトの名無しさん mailto:sage [2011/03/17(木) 16:58:13.74 ] 追加になります。
119 名前:デフォルトの名無しさん mailto:sage [2011/03/17(木) 20:10:10.61 ] で、溜まったまま出てこないの? 便秘かよw
120 名前:デフォルトの名無しさん mailto:sage [2011/03/17(木) 20:36:18.44 ] Cでfflush(stdout)するようなもん? 違うか
121 名前:デフォルトの名無しさん mailto:sage [2011/03/17(木) 22:02:21.39 ] それ初期化っていうかよ
122 名前:デフォルトの名無しさん mailto:sage [2011/03/17(木) 22:02:55.98 ] ファイナライズとか?
123 名前:デフォルトの名無しさん mailto:sae [2011/03/18(金) 00:05:53.42 ] closeだっちゃ
124 名前:デフォルトの名無しさん mailto:sage [2011/03/18(金) 22:45:57.66 ] 他スレから誘導されて参りました。 環境は Windows XP Service Pack 3 です。 sample.batという名のバッチファイルを作って、その挙動を 1.commandstring = "C:\sample_prgm.exe" のようにcommandstringという変数に右辺の文字列を代入する。 (バッチファイル中に直接書きこむ) 2.commandstringが有効なパスであるならば そのパスをコマンドとして(関連付けどおりに)実行させる。 (つまりコマンドプロンプトにcommandstringの中身を打ち込んだのと同じ動作をさせる) というふうにしたいのですが、どう書けばよろしいでしょうか? Pythonで言うなら ####################### import os, os.path commandstring = "C:\sample_prgm.exe" if os.path.exists(commandstring) : os.system(commandstring) ####################### です。 これをbatファイルでやりたいのです。 よろしくお願いいたします。
125 名前:デフォルトの名無しさん mailto:sage [2011/03/19(土) 00:14:09.04 ] set commandstring=C:\sample_prgm.exe if exist %commandstring% %commandstring%
126 名前:デフォルトの名無しさん mailto:sage [2011/03/19(土) 00:40:25.87 ] この手の方がパスにスペースを含むような使い方をするとはあんまり思わないけど スペースぐらいはケアした方が良いような・・・
127 名前:デフォルトの名無しさん mailto:sage [2011/03/19(土) 00:42:01.80 ] クレクレマンにそんなに親切に対応する必要なし。
128 名前:デフォルトの名無しさん mailto:sage [2011/03/19(土) 11:10:36.49 ] 質問があります お聞きしたいことはバッチファイルで出力されたログを上手く取るコツです 今はこのように非効率だとおもいながらもバッチファイルで標準出力やエラー出力をlog.txtに追加しています (このteeはここではパイプで渡された入力をファイルに追記するために使っています) ( NanikaSuruA.exe 2>&1) | tee -a log.txt ( NanikaSuruB.exe 2>&1) | tee -a log.txt 以下続く ただこの方法ではコマンドごとに記述することが手間と 標準出力を利用したいときにエラーが記録しづらく困っています。 例えば TokubetuNaNanika.exe > output.txt TokubetuNaNanika.exe は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 このようなときにパスが通っていないエラーが記録されていませんでした このときはrun_test.batを作りその中で処理したいbatを呼び出し表示されるものをログに追記するとよさそうに見えますが 一つのバッチファイルのにつき、さらにもう一つのログをとるためのラッパーのためのバッチファイルを用意することになります test.bat | tee -a log.txt もう少しいい方法はないかと質問させていただきました
129 名前:デフォルトの名無しさん mailto:sage [2011/03/19(土) 11:40:36.48 ] NanikaSuruA.exe >> log.txt 2>&1 TokubetuNaNanika.exe > output.txt 2>> log.txt