アカウント名:
パスワード:
ラベルで実現しようとしている部分を、「別のバッチファイル」に書いて値を渡せば良いんでありますよ。
あと、変数の動作を変更するための命令文があったけれどもなんだったっけか……
コメントありがとうございます。今回一番やりたかったことは、for文の途中で脱出…って書いてないですね。すいませんorz
他のバッチをコールするのは、確かにいい考えです。しかし、for文から脱出するような場合は使えないと思います。即exitすれば脱出できますが、それですとバッチ全体か、callされたバッチファイルからの脱出だけかのどちらかですので…。なかなか悩ましいです。
Windowsのコマンドスクリプトは、行単位で環境変数を展開してからコマンドを実行します。なので、
(echo %AAA%) & (set AAA=3) & (echo %AAA%)
という1行のコマンドがあった場合、この行の実行に入る前に二つ目の%AAA%も展開されてしまい、(事前にAAAに何も代入されていない場合)
ECHO は <ON> です。ECHO は <ON> です。
と出力されます。
“(”、“)”を使ってコマンドを囲むと、複数行に渡ってコマンドを書けますが、実行時には“(”、“)”で囲んだ全体を1行として解釈するので、上記と同じ問題が起こります。
( echo %AAA% set AAA=3 echo %AAA%)
一般的な変数と同じような感覚で使える変数として遅延環境変数というのがあって、
setlocal enabledelayedexpansion( echo !AAA! set AAA=3 echo !AAA!)
と書けば、
ECHO は <ON> です。3
と出力されます。レジストリの設定を変えると、デフォルトで遅延環境変数を有効にすることもできます。ただ、バッチファイルの中でないと使えないようです。
出遅れて、「余計なもの」(←古い)になっちゃいました……。orz
これだけではなんなんで、逆に、私が回避できていない問題を一つ。
貧弱だとはいえ、Windows環境であればどこにでも必ず入っているということで、ツールを作る時には、コマンドプロンプトだけでかなりがんばってものを作ったりするんですが、
for /l %I in (1,1,5) do (echo %I)
このコマンドを実行すると、(少なくともWindows XPでは)
D:\usr\saeki-k\My Documents\work\work>(echo 1 )1 D:\usr\saeki-k\My Documents\work\work>(echo 2 )2 D:\usr\saeki-k\My Documents\work\work>(echo 3 )3 D:\usr\saeki-k\My Documents\work\work>(echo 4 )4 D:\usr\saeki-k\My Documents\work\work>(echo 5 )5
のように、“)”の前に勝手に空白が入ってしまいます。これが、ファイルにリダイレクトしたときにも出力されてしまって、どうしても取り除くことができません(上のコマンドは、現象を再現させるシンプルな例で、実際にはもっといろんなコマンドが入っているものと考えてください)。
コメントありがとうございます。
setlocalコマンドとenabledelayedexpansionは大変興味深いです。結果的には一緒かもしれませんが、そちらの方がエレガントですね。しかし、setlocalコマンドのヘルプにENABLEDELAYEDEXPANSIONについての記述があるにもかかわらず、うまく動かないようです。ん~。何が悪いのか…。
については、Vistaでも同じ現象がでるようです。
なんとなく分かりました。setlocal ENABLEDELAYEDEXPANSIONは、どうも.cmdファイルの中でしか利かないようですね。「&」などで一行に複数命令書いた時でも、直接入力だとうまく動かないようです。
実用上は問題ありませんが、また変な動きというか…。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
普通のやつらの下を行け -- バッドノウハウ専門家
そういうときは (スコア:1)
ラベルで実現しようとしている部分を、「別のバッチファイル」に書いて値を渡せば良いんでありますよ。
あと、変数の動作を変更するための命令文があったけれどもなんだったっけか……
Re:そういうときは (スコア:1)
コメントありがとうございます。
今回一番やりたかったことは、for文の途中で脱出…って書いてないですね。
すいませんorz
他のバッチをコールするのは、確かにいい考えです。
しかし、for文から脱出するような場合は使えないと思います。
即exitすれば脱出できますが、それですとバッチ全体か、callされたバッチファイルからの脱出だけかのどちらかですので…。
なかなか悩ましいです。
Re:そういうときは (スコア:1)
Windowsのコマンドスクリプトは、行単位で環境変数を展開してからコマンドを実行します。なので、
という1行のコマンドがあった場合、この行の実行に入る前に二つ目の%AAA%も展開されてしまい、(事前にAAAに何も代入されていない場合)
と出力されます。
“(”、“)”を使ってコマンドを囲むと、複数行に渡ってコマンドを書けますが、実行時には“(”、“)”で囲んだ全体を1行として解釈するので、上記と同じ問題が起こります。
一般的な変数と同じような感覚で使える変数として遅延環境変数というのがあって、
と書けば、
と出力されます。レジストリの設定を変えると、デフォルトで遅延環境変数を有効にすることもできます。ただ、バッチファイルの中でないと使えないようです。
Re:そういうときは (スコア:1)
出遅れて、「余計なもの」(←古い)になっちゃいました……。orz
これだけではなんなんで、逆に、私が回避できていない問題を一つ。
貧弱だとはいえ、Windows環境であればどこにでも必ず入っているということで、ツールを作る時には、コマンドプロンプトだけでかなりがんばってものを作ったりするんですが、
このコマンドを実行すると、(少なくともWindows XPでは)
のように、“)”の前に勝手に空白が入ってしまいます。これが、ファイルにリダイレクトしたときにも出力されてしまって、どうしても取り除くことができません(上のコマンドは、現象を再現させるシンプルな例で、実際にはもっといろんなコマンドが入っているものと考えてください)。
Re:そういうときは (スコア:1)
コメントありがとうございます。
setlocalコマンドとenabledelayedexpansionは大変興味深いです。
結果的には一緒かもしれませんが、そちらの方がエレガントですね。
しかし、setlocalコマンドのヘルプにENABLEDELAYEDEXPANSIONについての記述があるにもかかわらず、うまく動かないようです。
ん~。何が悪いのか…。
については、Vistaでも同じ現象がでるようです。
Re:そういうときは (スコア:1)
なんとなく分かりました。
setlocal ENABLEDELAYEDEXPANSIONは、どうも.cmdファイルの中でしか利かないようですね。
「&」などで一行に複数命令書いた時でも、直接入力だとうまく動かないようです。
実用上は問題ありませんが、また変な動きというか…。