[過去ログ] 【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
690: 2018/08/04(土)03:29 ID:XmDLxyoB(1) AAS
ん?せやで?Windows 7はデフォルトの設定が違うんやで
しらんかったんか?cmd /?とかしてみな。
691: 687 2018/08/04(土)05:41 ID:z4XK4aXP(2/4) AAS
cmd /? にも setlocal /? にも echo /? にも
echoとパイプ併用時の環境変数の二重展開について記述は無いようです
692: 2018/08/04(土)07:14 ID:ZE1/UEds(1) AAS
ありまぁ〜す
693: 687 2018/08/04(土)07:43 ID:z4XK4aXP(3/4) AAS
別のものを見ているのかもしれません。
そちらには何と書いてありますか?
694: 2018/08/04(土)07:51 ID:HzKYXCJW(1/2) AAS
パイプってCall文でサブルーチン処理してるような物だし、call文と同じ展開をすると思っとけばいいんじゃね?
695: 687 2018/08/04(土)09:07 ID:z4XK4aXP(4/4) AAS
なるほど。
では逆にあえて二重展開したい場合はcallを使ったほうが無難でしょうか?
696: 2018/08/04(土)11:22 ID:HzKYXCJW(2/2) AAS
call文で変数内変数が1ネスト展開されるのはパイプよりは有名だと思う
697: 2018/08/04(土)11:35 ID:1BI89n66(1/2) AAS
一番知られて無いのが、for /f文の('コマンド')が同じく二重展開されるってのかな
698: 2018/08/04(土)11:40 ID:1BI89n66(2/2) AAS
いや本当は、コマンドの中で^を付けてエスケープしないといけない場合があることは
結構知られているんだけど、それが二重展開のせいだってことが認識されてないわけで
699: 2018/08/04(土)12:17 ID:hhRJxbHb(1) AAS
>>687
>>448
700: 687 2018/08/05(日)05:37 ID:DoWKU022(1) AAS
理解できました
みなさんありがとうございました
701: 2018/08/06(月)20:49 ID:9+kXWEFM(1) AAS
echo は結構罠
if "%errlorleverl%" ... も罠。
はやくバッチから救われたい…
702: 2018/08/11(土)19:21 ID:vbsvSkjm(1) AAS
何が罠なのかわからん
703(2): 2018/08/11(土)20:56 ID:WNr/dTgn(1) AAS
つづりを覚えられない奴には罠なんだろ w
704(2): 2018/08/11(土)21:47 ID:HlmNsX8I(1) AAS
こういうことじゃないかな?
set ERRORLEVEL=0
hogecommand
if %ERRORLEVEL% gtr 0 goto :ERROR
これが絶対真にならず、ジャンプしないとか
705: 2018/08/12(日)03:12 ID:lJZ67VC6(1/3) AAS
エラーは1以上とはかぎらないんだよな、コマンドによっては。
706(3): 2018/08/12(日)09:09 ID:pT5cyKVs(1/6) AAS
>>703
echo hoge > test.txt
て書くと「hoge」の後の半角空白までがtest.txtに出力されるんだよ。
>>704
代入しなくても、errorlevel を環境変数として判定に使うと正常に動かない場合がある。
具体的には
echo n | comp A.exe B.exe >NUL 2>&1
if not "%ERRORLEVEL%"="0" (
:
このとき、何故か%ERRORLEVEL% は常に「0」。バイナリ不一致でも「0」。
echo n | comp A.exe B.exe >NUL 2>&1
if not errorlevel 1 (
:
だと正常に動く。何故だか分からない。
707: 2018/08/12(日)09:13 ID:pT5cyKVs(2/6) AAS
>>706 にちょっと間違い。
〇 if "%ERRORLEVEL%"="0" (
× if not "%ERRORLEVEL%"="0" (
708(1): 2018/08/12(日)09:20 ID:yoDY/qSn(1) AAS
if の比較は = じゃなくて == だろ
709: 2018/08/12(日)09:40 ID:pT5cyKVs(3/6) AAS
>>708
悪い。typo。
〇 if "%ERRORLEVEL%"=="0" (
710(2): 2018/08/12(日)11:52 ID:eNrGPpfD(1) AAS
何故か以前にいろいろ間違いすぎなんだよ
ゼロから書き直せ
711: 2018/08/12(日)14:40 ID:IZr1Emsm(1) AAS
>>710
> ゼロから書き直せ
こんな感じっすかー?
0" ([HOME]if "%ERRORLEVEL%"=="
712: 2018/08/12(日)16:49 ID:dh6WaJfS(1) AAS
>>704>>706
ERRORLEVELは代入すると返却値として使えなくなるんじゃ
なかったっけ?
だからやるならば
set ERRORLEVEL=
だけにしないとだめなのでは
ただ、これをやってバッチ内でERRORLEVEL環境変数の
初期化みたいなことしてもうまく動かないこともあったような
気がするけど何か勘違いしてるんだろうな
713(2): 2018/08/12(日)18:02 ID:aLWFoJnR(1/3) AAS
>>706
パイプの動作が原因だろう
パイプの右側は子タスクでの実行となる(おそらくは)
メインタスクに環境を引き継がないんだと思う
echo "a"|for /f %%i in ('find "a"') do set x=OK
echo.%x%
これで%x%には値が入らない
echo "a"|find "a"&set x=OK
なら%x%にはOKが入るが
echo "a"|(find "a"&set x=OK)
では%x%にはOKが入らない
714: 2018/08/12(日)18:09 ID:aLWFoJnR(2/3) AAS
>>713
下2つ&は&&の間違いだが、別に&だろうが&&だろうが(この場合の)結果は変わらない
715: 2018/08/12(日)18:16 ID:lJZ67VC6(2/3) AAS
パイプはcallと一緒だなやはり
716: 2018/08/12(日)18:36 ID:lJZ67VC6(3/3) AAS
setコマンドの長いヘルプの下の方に
「ユーザーがこれらの名前の変数を明示的に定義する場合、
その定義は下記の動的な定義を無効にします。」
と書かれてる。errorlevelをsetするのは回避した方がいいだろう
717: 2018/08/12(日)18:40 ID:aLWFoJnR(3/3) AAS
ついでに言っとくと
パイプはデータの受け手が子タスクになったけど
for /fの'コマンド'は送り手が子タスクになる
従って、'コマンド'の中で環境変数に値を入れても、メインタスクには引き継がれない
718: 2018/08/12(日)21:23 ID:pT5cyKVs(4/6) AAS
>>710
難癖付けてばかりで話題提供もできない人はゼロから人生をやり直した方が(ry
719(1): 2018/08/12(日)21:38 ID:pT5cyKVs(5/6) AAS
>>713
んー、俺はもうそこまで調べる気もなくてね…ほぼ諦めてる。
子タスクとかどこの文献見ればあるんだろう?
あってもなくても、んなテクニック、引継ぎできる代物でもあるまい…。
例えば、
type data.txt | cscript //nologo hoge.vbs
if not errorlevel 1 (
:
これも実は…駄目なのだ!!
VBScript側で Call WScript.Quit(1)
で抜けられれば引っかかるが…
想定外の変なデータを食わされてランタイムエラーで落ちた場合には引っかからない。
cscript はスクリプトエンジンだから別物扱いしとこ…てなところで。
hoge.vbs が正常終了する直前に success.txt を空で作るようにしといて。
del success.txt
type data.txt | cscript //nologo hoge.vbs
if exist success.txt (
:
)
del success.txt
こんな感じにするしかなかったし、これならせめて引継ぎができると思う。
上下前次1-新書関写板覧索設栞歴
あと 283 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.012s