104

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

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

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

4

2 に答える 2

160

(詳細については、アーカイブされた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
于 2013-01-24T20:27:24.670 に答える
18

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

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

于 2013-01-24T20:23:35.600 に答える