我正在尝试从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 : 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
,因为我在使用例如调用运算符时扩展变量遇到了很大的问题。但是即使没有变量扩展,我也无法使其正常工作。因此,如果解决方案是转义命令字符串的某些部分,我还需要知道如何将这些转义应用于变量。
" ... -dPlatform=$Platform ""-dProductVersion=$ProductVersion"" -dKarteReleaseBinDir= ... "
如果你想把它放在答案中,我会标记它为已接受的。我也很好奇为什么它能工作。我认为单引号应该保留字符串。 - Dave Mateerget-arg
工具显示原始命令被分割为:-dProductVersion=0
和.9.1.0
是不同的参数。 - Roman Kuzmin