如何从PowerShell命令行转义管道字符以传递到非PowerShell命令

时间:2016-06-25 19:43:38

标签: shell powershell command-line escaping

我在PowerShell控制台会话中,尝试从PowerShell命令行运行cwd中存在的Gradle脚本。

Gradle命令接受一个参数,其中包含可以包含一个或多个管道符号的引号,我不能在我的生活中弄清楚如何让PowerShell只使用一行(或任意数量的行)来逃避它实际上 - 但我对多线解决方案不感兴趣。)

这是命令:

./gradlew theTask -PmyProperty="thisThing|thatThing|theOtherThing"

...产生此错误:

'thatThing' is not recognized as an internal or external command, operable program or batch file.

我已经尝试了所有这些变体,但都没有效果。有什么想法吗?

./gradlew theTask -PmyProperty="thisThing`|thatThing`|theOtherThing"
./gradlew theTask -PmyProperty=@"thisThing|thatThing|theOtherThing"
./gradlew theTask -PmyProperty="thisThing\|thatThing\|theOtherThing"
./gradlew theTask -PmyProperty="thisThing\\|thatThing\\|theOtherThing"
./gradlew theTask -PmyProperty="thisThing^|thatThing^|theOtherThing"

2 个答案:

答案 0 :(得分:2)

好吧,我发现了:

首先按照我的第一个建议调用你的脚本:

./gradlew theTask -PmyProperty="thisThing^|thatThing^|theOtherThing"

然后通过添加引号修改gradlew.bat脚本:

set CMD_LINE_ARGS="%*"

问题是:现在必须在引号内调用CMD_LINE_ARGS,否则会发生同样的错误。

所以我假设你的命令行参数不能是其他东西而且我正在逐个处理每个参数

rem now remove the quotes or there will be too much quotes
set ARG1="%1"
rem protect or the pipe situation will occur
set ARG1=%ARG1:""=%
set ARG2="%2"
set ARG2=%ARG2:""=%
set ARG3="%3"
set ARG3=%ARG3:""=%

echo %ARG1% %ARG2% %ARG3%

输出是(对于我的模型命令):

theTask -PmyProperty "thisThing|thatThing|theOtherThing"

“=”已经消失,因为它已将参数与PowerShell分开。我想如果你的命令有标准的参数解析,这不会是一个问题。

根据需要添加任意数量的参数,但无论如何都要将其限制为9.

答案 1 :(得分:0)

发现了另一种可能性here。这样可以使用单引号和双引号。不确定这是否有助于解决原始问题,但有助于解决我的问题。

'"thisThing|thatThing|theOtherThing"'