如何传递包含&的参数来自cygwin bash的bat文件

时间:2012-10-02 21:46:37

标签: shell batch-file cygwin

这是一个简单的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 shell中调用它:

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.

1 个答案:

答案 0 :(得分:1)

Windows CMD使用^来转义大多数特殊字符。因此,您可以使用它来传递您的参数而不附上引号。

C:\temp>a.bat a^&b

但收到的参数为a&b。当您尝试ECHO值为%1时,您的批处理脚本会出错,因为&未被引用或转义。

如果将其括在引号中,则可以安全地回显该值:

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启动脚本时导致问题,或者当您回收它时在脚本中导致问题。

以下其中一项应该可以正常运行,将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\""