Как передать знак равенства при вызове пакета script в Powershell?
У нас есть пакетный файл, который вызывает наш процесс сборки на основе MSBuild. Синтаксис:
build App Target [ Additional MSBuild Arguments ]
Внутри он делает это:
msbuild.exe %1.msbuild /t:%2 %3 %4 %5 %6 %7 %8 %9
Что вызывает вызовы MSBuild, которые выглядят следующим образом:
msbuild.exe App.msbuild /t:Target
Если какой-либо аргумент содержит знак равенства, =
, Powershell полностью удаляет его. Моя партия script никогда не увидит. Это не происходит со стандартной командной строкой cmd.exe
.
Например, если я вызываю
build App Target "/p:Property=Value"
это то, что передается в MSBuild:
msbuild.exe App.msmbuild /t:Target /p:Property Value
Я ожидал этого:
msbuild.exe App.msbuild /t:Target "/p:Property=Value"
Я попробовал escape-символ Powershell, стандартный escape-символ командной строки и даже то, что я составил:
build App Target "/p:Property=Value"
build App Target '/p:Property=Value'
build App Target /p:Property^=Value
build App Target /p:Property`=Value
build App Target /p:Property==Value
Ничего из этого не работает. Что мне делать, чтобы получить знак равенства, чтобы его не удаляли или удаляли?
Ответы
Ответ 1
Я видел это раньше и нашел способ обмануть его. Хотел бы я объяснить, что происходит, в частности, с "=", но я не могу. В вашей ситуации я уверен, что следующее будет работать, если вы хотите передать свойства msbuild:
build App Target '"/p:Property=Value"'
При повторном отображении это вызывает следующее:
msbuild.exe App.msbuild /t:Target "/p:Property=Value"
Ответ 2
С PowerShell 3 вы можете использовать -%, чтобы остановить нормальную синтаксическую разборку.
build --% App Target "/p:Property=Value"
Ответ 3
Я не знаю, есть ли более простой ответ (я думаю, нет), но вы можете решить проблему, используя класс .Net для вызова cmd.exe. Вот пример:
# use .NET Process class to run a batch file, passing it an argument that contains an equals sign.
# This test script assumes the existence of a batch file "c:\temp\test.bat"
# that has this content:
# echo %1
# pause
$cmdLine = $cmdLine = '/c c:\temp\test.bat "x=1"'
$procStartInfo = new-object System.Diagnostics.ProcessStartInfo("cmd", $cmdLine )
$proc = new-object System.Diagnostics.Process
$proc.StartInfo = $procStartInfo
$proc.Start();
Ответ 4
Вы пробовали одиночные кавычки, чтобы заставить буквальную интерпретацию?
Или: cmd/c 'msbuild.exe App.msbuild/t: Target "/p: Свойство = Значение" '
Ответ 5
Кажется, что только одиночная кавычка вокруг двойной кавычки может быть лучшей для множественного сценария вокруг среды Windows.
По ссылке из MS показана его поддержка (или ограничение) равного знака
http://support.microsoft.com/kb/35938
Он специфичен для пакетных файлов, но, вероятно, влияет на множество других продуктов оболочки MS.