这是一个简单的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.
答案 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\""