如何转义PowerShell保留字?



我正在使用PowerShell编写一个命令来执行OpenCover,其中有一个标志-filter

然而,Filter是PowerShell中的保留字之一。

我生成的命令(在CMD下运行良好)是:
OpenCover.Console.exe -output:Coverage.xml -register:user -filter:"+[*]* -[*]*.Test*" -target:nunit-console.exe -targetargs:"Test.dll /config:Release /noshadow /nologo /labels"

但是当我在PowerShell中运行它时,我得到一个错误:

Incorrect Arguments: The argument [*]*.Test* is not recognised

这与filter在PowerShell中是保留字无关。PowerShell如何向本机应用程序传递参数的问题。您的命令行将被传递为:

OpenCover.Console.exe -output:Coverage.xml -register:user "-filter:"+[*]* -[*]*.Test*"" -target:nunit-console.exe "-targetargs:"Test.dll /config:Release /noshadow /nologo /labels""

一些额外的引号,由PowerShell添加,导致错误的命令行将传递给本机应用程序。

你可以尝试的第一件事是将命令行改为如下:

OpenCover.Console.exe -output:Coverage.xml -register:user "-filter:+[*]* -[*]*.Test*" -target:nunit-console.exe "-targetargs:Test.dll /config:Release /noshadow /nologo /labels"

在这种情况下,PowerShell将不会添加额外的引号,并且OpenCover.Console.exe可能会识别您的命令。

如果没有帮助,那么您可以使用Start-Process cmdlet,它永远不会添加任何额外的引号:

Start-Process OpenCover.Console.exe '-output:Coverage.xml -register:user -filter:"+[*]* -[*]*.Test*" -target:nunit-console.exe -targetargs:"Test.dll /config:Release /noshadow /nologo /labels"' -NoNewWindow -Wait

您是否尝试过阅读PowerShell技术上的"about_Escape_Characters"部分?https://technet.microsoft.com/en-us/library/hh847755.aspx

停止解析符号

在调用其他程序时,您可以使用停止解析符号(——%)来防止Windows PowerShell生成错误或误解程序参数。停止解析符号是在程序调用中使用转义字符的替代方法。它在Windows PowerShell 3.0中被引入。

例如,以下命令使用了Icacls命令中的停止解析符号:

icacls X:VMS --% /grant DomHVAdmin:(CI)(OI)F

有关停止解析符号的详细信息,请参见about_Parsing。

最新更新