Windows CMD は^
、ほとんどの特殊文字をエスケープするために使用します。したがって、それを使用して、引用符で囲まずに引数を渡すことができます。
C:\temp>a.bat a^&b
しかし、受け取るパラメータはa&b
. バッチ スクリプトが %1 の値を ECHO しようとすると、エラーが発生します。これは、&
が引用符またはエスケープされていないためです。
値を引用符で囲むと、値を安全にエコーできます。
echo "%1"
ただし、すでに引用符で囲まれた値を渡すと、"a&b"
再びエラーが発生します。そのため、多くのバッチ スクリプトでは~
修飾子を使用して、既存の囲み引用符 (存在する場合) を削除してから、明示的に引用符を追加します。%1 の値が引用されているか引用されていない場合、以下は機能します。
echo "%~1"
のようなものでまだ問題が発生する可能性があります"a&b"&c
が、それは別の話です:-)
別のオプションは&
、元のコマンド ラインでダブル エスケープすることです。
C:\temp>a.bat a^^^&b
バッチ スクリプトが を受信a^&b
すると、エコーが機能します。
Cygwin に関しては、私はほとんど知りませんが、テスト 1、2、および 3 はほとんど理解していると思います。
テスト 1:
sh-4.1$ ./a.bat a&b
[1] 7760
a
sh: b: command not found
Cygwin がa
バッチ スクリプトに渡され、コマンドの実行に失敗していますb
テスト 2:
sh-4.1$ ./a.bat a\&b
a
'b' is not recognized as an internal or external command, operable program or batch file.
バッチ スクリプトが実行される前に CMD が Cygwin から渡されたコマンド ラインを解析するかどうかはわかりません。
その場合、a
バッチ スクリプトに渡され、CMD.EXE の実行に失敗していb
ます。
そうでない場合、Cygwin はスクリプトを正常に実行して を渡しa&b
ていますが、前に説明したように ECHO ステートメントは失敗しています。
次のいずれかがスクリプトで機能するはずですが、どれかわかりません。
sh-4.1$ ./a.bat a^\&b
or
sh-4.1$ ./a.bat a^^^\&b
上記のいずれかがパスa^&b
し、ECHO が機能するはずです。
テスト 3:
sh-4.1$ ./a.bat \"a\&b\"
"\"a
'b\""' is not recognized as an internal or external command, operable program or batch file.
Cygwinが何をしているのかわかりません。どういうわけか、追加の二重引用符が導入されています。
テスト 4:
sh-4.1$ ./a.bat "a\&b"
a\
'b' is not recognized as an internal or external command, operable program or batch file.
Cygwin は引用符を取り除き、バックスラッシュは保持されます。繰り返しますが&
、CMD.EXE がスクリプトを起動するときに問題が発生するか、ECHO 時にスクリプト内で問題が発生します。
次のいずれかが機能a^&b
し、スクリプトに渡されます。どちらかわかりません:
sh-4.1$ ./a.bat "a^&b"
or
sh-4.1$ ./a.bat "a^^^&b"
以下がスクリプトに正常に渡さ"a&b"
れると思います。
sh-4.1$ ./a.bat '"a&b"'
また、テスト 3 の結果から確信が持てませんが、次も同じようになると思います。
sh-4.1$ ./a.bat "\"a&b\""