変数のIF条件チェックと同じ行のechoステートメントでパーセント記号(%)を使用する

変数のIF条件チェックと同じ行のechoステートメントでパーセント記号(%)を使用する

この行をバッチファイルで使用しようとしています

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

実行するとこうなります

) was unexpected at this time.

C:\>      If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")

(ARGUMENT = バッチ ファイルを実行するときに使用した引数/パラメータ)

「Log File.txt」を「LogFile.txt」に変更したり、パスを囲む引用符を削除したり、さまざまなバリエーションを試しましたが、符号 %(変数をエコーし​​ようとするため) またはコロン (パスから の右側) があると必ずエラーが発生するという点に絞り込みました>>。コロンの問題が何なのかはわかりませんが、コロンは%貪欲で、行を読み取って、テスト対象の変数がペアで囲まれたすべての内容の連結文字列全体 %と行の残り (おそらく、後に演算子がないため、EOL まで継続し、そこで括弧にぶつかるため) であると解釈しているようです。したがって、何かをエスケープする必要があるか、他に変更する必要があるか、または単に不可能であるかのいずれかのようです。

私は、echo文を次のように別の行に置くだけでよいことに気づきました。

If NOT... (
  echo...
)

しかし、私はそれを 1 行で実行することを好みます。その理由の一部は、その方がきれいだからですが、主な理由は、好奇心が強く、このようなことを理解するのが好きで、それができないのが嫌だからです。

ちなみに遅延表現は有効になっています。

編集:@AFHのコメントに基づいて、バッチファイルで単独でテストしたところ、

@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

エラーは出ないが何でもその後(たとえば、endlocal次の行または次の空白行)に記述すると、そのようになります。しかし%1ADH が述べたように、の代わりにを使用すると%1%問題は解決しました。したがって、これは解決されました。

答え1

正確なエラーを再現することはできませんでしたが、確認できましたAFHの観察コマンドラインパラメータは(例えば、、 など)であり、ではないので、コマンドは%n%1%2%n%

If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

追加の を含めると何が起こるかについて、少し説明できると思います %。CMD は、他の処理を実行する前に、コマンドラインを解析してパラメータと変数を探すようで、非常に単純なパーサーを使用しています。 に遭遇すると %

  • 次の文字が数字の場合、それは位置パラメータです。%n
  • それ以外の場合は変数()となり、%name%すべて%name一致するものがない場合は、本当に混乱すると思います%

コマンドは次のように解析されます:

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
        \/\---------------/   \-----------/           \---------------------- ...?

"=="foo" (echo とは Text. >> "変数名、barはリテラル テキストであると認識されますUSERPROFILE。たとえば、引数「hello」を指定してコマンドを実行すると、次のようなエラー メッセージが表示されます。

コマンドの構文が正しくありません。
 
C:(カレントディレクトリ)> 「hellobarUSERPROFILE\Desktop\Log File.txt」でない場合は、

関連情報