Я пытаюсь вызвать команду из сценария 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
, потому что у меня были серьезные проблемы с расширением переменных с использованием, например, оператора вызова. Но я не могу заставить его работать даже без расширения переменной. Таким образом, если решение состоит в том, чтобы экранировать определенные части командной строки, мне также необходимо знать, как применять эти экранированные переменные к переменным.