%variable%
環境変数です。これらは で設定され、またはset
でアクセスできます(有効な場合は遅延拡張を使用)。現在のループ項目または現在の行のトークンを表すためにコマンドによって作成される特別な変数です。%foo%
!foo!
%%a
for
for
おそらく、バッチ ファイルの最も複雑で強力な部分です。ループが必要な場合for
は、ほとんどの場合カバーしています。help for
まとめがあります。
あなたはできる
- ファイルを繰り返します:
for %x in (*.txt) do ...
- 何かをn回繰り返す:
for /l %x in (1, 1, 15) do...
(引数はstart、step、end )
- 一連の値を反復します。
for %x in (a, b, c) do ...
- ファイルの行を繰り返します。
for /f %x in (foo.txt) do ...
- ファイルの行をトークン化します。
for /f "tokens=2,3* delims=," %x in (foo.txt) do ...
- コマンドの出力を反復します。
for /f %x in ('somecommand.exe') do ...
それはほんの短い概要です。より複雑になりますが、それについてはヘルプをお読みください。
形式の変数%%a
(またはがバッチ ファイルの外部で使用される%a
場合for
) は、バッチ ファイルおよびサブルーチン ( %1
、%2
、 ...) への引数に非常に似ています。いくつかの種類の展開をそれらに適用できます。たとえば、変数が使用できるパス付きのファイル名を表している場合、ファイル名と拡張子だけを取得できます%%~nxa
。それらの完全な概要を に示しますhelp for
。
一方、環境変数には他の種類の特別なものがあります。would %foo:a=b%
result in %foo%
except that everya
が a b
. また、部分文字列を取ることもできます: %foo:~4,2%
. これらの説明は、 にありhelp set
ます。
%variables%
とが異なる理由について%%a
は、答えるのが少し難しく、おそらく歴史的な奇妙さです。上で概説したように、第 3 の種類の変数%1
などがあります。これらは で使用されているものと非常によく似ておりfor
、以前から存在していると思います。ブロックのために環境変数を使用するのは少し扱いにくくfor
、遅延拡張に大きく依存しているため、環境変数の代わりに引数と同じメカニズムを使用することが決定された可能性があります。
また、環境変数は、プロセスがペアで保存される特別な「環境」メモリ ブロックを持っていることを考えると、より高価になる可能性があります。variable=value␀
そのため、環境変数の更新には、メモリの一部をコピーする可能性があり、他の種類の変数はより軽量になる可能性があります。 . これは推測ですが。
あなたの問題に関しては、for
ここでは本当に必要ありません:
find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=a" && set usemenu=a
set
これは、前のコマンドが成功した場合、つまり見つかった場合にのみ実行menu=a
されます。これは よりもかなり簡単ですfor
。menu=a
私が読んだことから、コロンを含まない行に存在するかどうかを調べようとしていて、その場合usemenu
は に設定する必要がありa
ますよね? b
(そして forとについても同様ですc
。for
ファイルまたは出力の行をループし、適切にトークン化して の値を把握することで、それを行うように説得することができmenu
ますが、行の形式によっては、これはトリッキーになる可能性があります。理論的には機能するので、それに固執する必要があります. ただし、ループを使用してa
、 、 、b
およびに対して同じ行を 3 回繰り返す必要がないようにすることができc
ます。
for %%X in (a b c) do (
find /v ":" "%appdata%\gamelauncher\options.txt" | find "menu=%%X" && set usemenu=%%X
)
ただし、解析しているファイルが単純で、name=value
各行に: foo
コメントになるペアがあるだけの場合は、次のように使用することもできfor
ます。
for /f "tokens=1,* eol=: delims==" %%A in (%appdata%\gamelauncher\options.txt) do (
if "%%A"=="menu" set usemenu=%%B
)
ただし、それはファイルの正確な形式に少し依存します。上記のスニペットは、ファイルを 1 行ずつ読み取り、各行でコロン (eol=:
オプション) の後のすべてを破棄し、等号をトークン区切り文字として使用して、2 つのトークン (最初の部分の前の部分=
とその後のすべて) をキャプチャします。トークンは で始まる名前が付けられて%%A
いるため、2 番目のトークンは暗黙的に指定されます%%B
(これについては、 で説明しhelp for
ます)。ここで、各行について最初のトークンを調べて、そうであるかどうかを調べ、menu
そうであれば、その値をusemenu
変数に代入します。サポートできるオプションがたくさんある場合は、これを維持する方が確かに簡単です :-)。