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\""