Powershell Invoke-Expression mangling命令

时间:2011-10-18 14:38:53

标签: powershell

我正在尝试从powershell脚本调用命令。从正常命令行运行时,该命令正常工作。这是完整的命令(对不起,它很长,但是如果我截断它,我担心我可能会遗漏一些重要的命令。)

C:\Users\Dave.Work\Desktop\wix36-binaries\candle.exe C:\Users\Dave.Work\Developer\MapCreator\install\win\product.wxs -arch x64 -dPlatform=x64 -dProductVersion=0.9.1.0 -dKarteReleaseBinDir=C:\Users\Dave.Work\Developer\MapCreator\karte-build-release\release -out C:\Users\Dave.Work\Developer\MapCreator\install\win\obj\

如果我使用Invoke-Expression调用此完全相同的命令,则会失败。它从可执行文件(candle.exe)中给出了一个错误,但由于它在命令行中工作正常,因此问题显然是PowerShell以某种方式破坏了字符串。这是我的电话:

Invoke-Expression 'C:\Users\Dave.Work\Desktop\wix36-binaries\candle.exe C:\Users\Dave.Work\Developer\MapCreator\install\win\product.wxs -arch x64 -dPlatform=x64 -dProductVersion=0.9.1.0 -dKarteReleaseBinDir=C:\Users\Dave.Work\Developer\MapCreator\karte-build-release\release -out C:\Users\Dave.Work\Developer\MapCreator\install\win\obj\'

这会导致candle.exe

出现以下错误
candle.exe : error CNDL0103 : The system cannot find the file '.9.1.0' with type 'Source'.

不知何故,数字版本号被破坏了?同样,它在命令行中运行良好。

如何将此命令传递给Powershell?

[注意] 最终,此命令是从变量生成的,即实际命令将类似于:

$WixDir\candle.exe $ScriptDir\product.wxs -arch $Platform -dPlatform=$Platform -dProductVersion=$ProductVersion -dKarteReleaseBinDir=$KarteReleaseBinDir -out $ScriptDir\obj\

我正在使用Invoke-Expression因为我在使用例如调用运算符扩展变量时遇到了重大问题。但即使没有变量扩展,我也无法使它工作。因此,如果解决方案是要逃避命令字符串的某些部分,我还需要知道如何将这些转义应用于变量。

1 个答案:

答案 0 :(得分:7)

尝试使用“或with”附带的“-dProductVersion = 0.9.1.0”。我的Get-Arg实用程序显示原始命令已解析,因此-dProductVersion=0.9.1.0是不同的参数。

以防万一,我的Get-Arg.exe是(C#):

using System;
class GetArg
{
    static void Main(string[] args)
    {
        foreach(string s in args)
        {
            Console.WriteLine(s);
        }
    }
}

检查此类案件非常有用。


甚至更简单的插图。这段代码

function Get-Argument {
    $args
}

Get-Argument -dProductVersion=0.9.1.0

获得此输出:

-dProductVersion=0
.9.1.0

这就是PowerShell将这样的命令视为有两个参数。


说明

PowerShell 2 0 Language Specification我们可以看到参数

parameter-char:
Any Unicode character except
{   }   (   )   ;   ,   |   &   .   [
colon
whitespace
new-line-character

注意:包含'=','。'被排除在外。在我们的例子中,我们有

-dProductVersion=0.9.1.0

根据规范''之前的所有字符。是有效的参数 字符。所以我们得到,第一个结果参数是-dProductVersion=0

然后解析器在'。'处窒息。从技术上讲,看起来我们做了一些反对 规则包括'。'进入以' - '开头的参数。这就是我们的原因 应该用“或”包围整个论点。

对于其他被排除的角色也可能是这样。