我正在尝试从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
因为我在使用例如调用运算符扩展变量时遇到了重大问题。但即使没有变量扩展,我也无法使它工作。因此,如果解决方案是要逃避命令字符串的某些部分,我还需要知道如何将这些转义应用于变量。
答案 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
然后解析器在'。'处窒息。从技术上讲,看起来我们做了一些反对 规则包括'。'进入以' - '开头的参数。这就是我们的原因 应该用“或”包围整个论点。
对于其他被排除的角色也可能是这样。