如何通过powershell在其参数中运行带有管道字符的命令?

时间:2016-08-30 13:24:27

标签: powershell parsing

我希望运行命令:

mocha -i -g 'database|network|skip'

管道是mocha参数的一部分。然而,PowerShell认为'网络'是一个我试图管道的程序:

network : The term 'network' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path
包含

,验证路径是否正确,然后重试。

一些研究提到the --% operator to stop Powershell parsing

  

停止分配: - %         Windows PowerShell 3.0中引入的停止解析符号( - %),         指示Windows PowerShell不要将输入解释为         Windows PowerShell命令或表达式。

然而跑步:

mocha --% -i -g 'database|network|skip'

仍然会出现同样的错误。这是有道理的,因为:

  

停止解析符号仅在下一个换行符或      管道特征。

如何在powershell中运行带管道符号的命令?

编辑:对于在复制问题后拒绝相信我的人的图片,并由两个人回答:

enter image description here

2 个答案:

答案 0 :(得分:2)

感谢PowerShell and external commands done right。您可以引用管道字符来停止powershell将其视为管道。在这种情况下:

mocha -g 'network"|"database"|"skip'

完美无缺。正如@matt提到的那样,你也可以运行(更整洁):

mocha -i -g '"database|network|skip"'

答案 1 :(得分:2)

使用find的示例,您将获得类似的结果。

find /c "this|that|andtheotherthing" C:\temp\EventCombMT.txt

find : FIND: Parameter format not correct
At line:1 char:1
+ find /c "this|that|andtheotherthing" C:\temp\EventCombMT.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (FIND: Parameter format not correct:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

非常确定这是因为PowerShell解释器使用了引号,而且mocha命令带有不带引号的字符串。加倍报价是另一个阻止这一点。

find /c '"this|that|andtheotherthing"' C:\temp\EventCombMT.txt 

摩卡似乎不是这样吗?在评论中,我们确定需要反转find示例中所见的引用集。

your linked post所示,有更好的方法可以调用外部命令。就像使用call运算符和hashtable一样。你仍然需要解决报价。您也可以转义一组双引号以获得类似的效果。

find /c "`"this|that|andtheotherthing`"" C:\temp\EventCombMT.txt

这是正确的,虽然它与你得到的错误并不完全匹配。虽然我对解决方案是正确的,但我对这个问题的解释可能是错的。无论引用方式如何,PowerShell都不应该关心管道特征。这就是报价的用途。