【问题标题】:how to pass a parameter containing & to a bat file from cygwin bash如何将包含&的参数从cygwin bash传递给bat文件
【发布时间】:2012-09-23 19:29:44
【问题描述】:

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

【问题讨论】:

  • 从你的尝试中,a\&b 才有意义.. 应该可以工作.. 很奇怪
  • 其余的都是随机的绝望行为 :)

标签: shell batch-file cygwin


【解决方案1】:

Windows CMD 使用^ 转义大多数特殊字符。所以你可以用它来传递你的论点而不用加引号。

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

但接收到的参数将是a&b。您的批处理脚本在尝试回显 %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 启动脚本时导致问题,或者在您 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\""

【讨论】:

  • 如果我的 bat 文件回显 "%1" 而不是 %1 那么`./a.bat a^\&b`和`./a.bat "a^&b"`都打印@987654352 @。我还没有尝试其他选项,感谢^ escape char 提醒。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2011-08-23
  • 2012-12-08
  • 2015-06-08
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多