17
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=a"') do ( set usemenu=a )
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=b"') do ( set usemenu=b )
for /f "tokens=*" %%a in ('find /v ":" "%appdata%\gamelauncher\options.txt" ^| find "menu=c"') do ( set usemenu=c )

そうです、このコード (これは動作しない可能性があります。私が見つけようとしているものです) では、この "%%a" がその 'for' コマンドに含まれています。

まず、%variable% と %%a の違いは何ですか?

次に、誰かが「for」コマンドについて説明してくれませんか? 私はGoogleでそれをやりすぎましたが、すべての説明は複雑に思えます...

私がやろうとしているのは、options.txt から変数を取得することです。これにより、ゲーム ランチャーのメニュー スタイルを変更できます。3 つのスタイル (a、b、c) があるため、options.txt に "menu=a" と表示されている場合、%usemenu% のような変数を a の値に設定するにはどうすればよいですか?

事前に助けてくれてありがとう!

4

1 に答える 1

49

%variable%環境変数です。これらは で設定され、またはsetでアクセスできます(有効な場合は遅延拡張を使用)。現在のループ項目または現在の行のトークンを表すためにコマンドによって作成される特別な変数です。%foo%!foo!%%afor

forおそらく、バッチ ファイルの最も複雑で強力な部分です。ループが必要な場合forは、ほとんどの場合カバーしています。help forまとめがあります。

あなたはできる

  • ファイルを繰り返します:for %x in (*.txt) do ...
  • 何かをn回繰り返す: for /l %x in (1, 1, 15) do...(引数はstartstepend )
  • 一連の値を反復します。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されます。これは よりもかなり簡単ですformenu=a私が読んだことから、コロンを含まない行に存在するかどうかを調べようとしていて、その場合usemenuは に設定する必要がありaますよね? b(そして forとについても同様ですcforファイルまたは出力の行をループし、適切にトークン化して の値を把握することで、それを行うように説得することができ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変数に代入します。サポートできるオプションがたくさんある場合は、これを維持する方が確かに簡単です :-)。

于 2013-03-15T09:40:22.867 に答える