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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从PowerShell命令行转义管道字符以传递到非PowerShell命令相关的知识,希望对你有一定的参考价值。

我在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"
答案

好吧,我发现:

首先像我最初建议的那样调用你的脚本:

./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。

以上是关于如何从PowerShell命令行转义管道字符以传递到非PowerShell命令的主要内容,如果未能解决你的问题,请参考以下文章

如何转义任意字符串以用作 Bash 中的命令行参数?

VBScript调用powershell,转义字符[重复]

PowerShell 学习笔记——管道

如何转义变量中的特殊字符以在 bash 中提供命令行参数

通过回声管道将python变量(字符串)传递给bash命令[重复]

理解Powershell管道