cmdファイルの%と%%の違いは何ですか?


88

最近、これに似た行を.cmdファイルに含めました。

for /f %%f in ('dir /b .\directory\*.sql') DO sqlcmd -b -o ".\directory\output\%%f.txt" -i ".\directory\%%f"

もともと私は%fしか使用していませんでしたが、コマンドラインで実行すると正常に機能しましたが、ファイルを実行すると機能しませんでした。%% fに切り替えると、ファイルで機能しました。違いは何だろうと思っています。

回答:


138

(詳細については、アーカイブされたMicrosoft KBの記事を参照してください。)

知っておくべき3つのこと:

  1. パーセント記号は、コマンドラインパラメータを表すために、バッチファイルで使用されます%1%2...
  2. 文字を間に挟んだ2パーセント記号は、変数として解釈されます。

    echo %myvar%

  3. (バッチファイル内で)間に何もない2つのパーセント記号は、(バッチファイルではなく)コマンド内の1つのパーセント記号のように扱われます。%%f

なんで?

たとえば、(簡略化された)コマンドラインを実行すると

FOR /f %f in ('dir /b .') DO somecommand %f

バッチファイルでは、ルール2は解釈を試みます

%f in ('dir /b .') DO somecommand %

変数として。これを防ぐには、ルール3を適用%し、2番目のルールでエスケープする必要があります%

FOR /f %%f in ('dir /b .') DO somecommand %%f

21
バッチファイルからではなく、コマンドプロンプトから直接実行したときに、FORループで1パーセント記号を使用するだけで済む理由についての説明はありますか?DOSの遺産については知っていますが、コマンドラインから変数を使用できるようになりました。
Alec Mev 2013年

6
また、変数が1文字であることを確認してください。
ジグガンジャー2016

1
%を含むコマンドを発行したい場合はどうなりますか?例:for / f %% i in( 'git log -1 --pretty = format: "%% H"')do set GIT_COMMIT = %% i
Tanka

15

DOSでは、コマンドラインで環境変数を使用することはできませんでした。バッチファイルでのみ、%記号を区切り文字として使用していました。ステートメントなどの%バッチファイルでリテラル記号echoが必要な場合は、それを2倍にする必要がありました。

これは、コマンドラインで環境変数を許可するWindows NTに引き継がれましたが、下位互換性のため%に、.cmdファイルの符号を2倍にする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.