1

簡単なbatファイルは次のとおりです。

C:\temp>type a.bat
@echo off
rem try
echo %1

いくつかの困難を伴い、私はa&bそれにパラメータとして渡すことができます:

C:\temp>a.bat a&b
a
'b' is not recognized as an internal or external command,
operable program or batch file.
C:\temp>a.bat "a&b"
"a&b"

パラメータには"文字があります。私はそれと一緒に暮らすことができます。しかし、cygwinシェルからそれを呼び出す方法を理解することはできません:

C:\temp>c:\cygwin\bin\sh
sh-4.1$ ./a.bat a&b
[1] 7760
a
sh: b: command not found
sh-4.1$ ./a.bat a\&b
a
'b' is not recognized as an internal or external command,
operable program or batch file.
[1]+  Done                    ./a.bat a
sh-4.1$ ./a.bat \"a\&b\"
"\"a
'b\""' is not recognized as an internal or external command,
operable program or batch file.
sh-4.1$ ./a.bat "a\&b"
a\
'b' is not recognized as an internal or external command,
operable program or batch file.
4

1 に答える 1

1

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\""
于 2012-10-03T00:22:18.397 に答える