Как передать знак равенства при вызове пакетного скрипта в Powershell? - PullRequest
15 голосов
/ 09 февраля 2011

У нас есть пакетный файл, который вызывает наш процесс сборки на основе MSBuild. Синтаксис:

build App Target [ Additional MSBuild Arguments ]

Внутренне, это делает это:

msbuild.exe %1.msbuild /t:%2 %3 %4 %5 %6 %7 %8 %9

Что приводит к вызовам MSBuild, которые выглядят так:

msbuild.exe <b>App</b>.msbuild /t:<b>Target</b>

Если какой-либо аргумент содержит знак равенства, =, Powershell полностью удаляет его. Мой пакетный скрипт никогда его не видит. Этого не происходит со стандартной командной строкой 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

Ничего из этого не работает. Что мне сделать, чтобы знак равенства не был удален или удален?

Ответы [ 5 ]

20 голосов
/ 09 февраля 2011

Я видел это раньше и нашел способ обмануть . Хотелось бы объяснить, что происходит, в частности, знаком '=', но я не могу. В вашей ситуации я вполне уверен, что следующее будет работать, если вы захотите передать свойства в msbuild:

build App Target '"/p:Property=Value"' 

При отражении это выдает следующее:

msbuild.exe App.msbuild /t:Target "/p:Property=Value"
2 голосов
/ 04 мая 2013

С PowerShell 3 вы можете использовать -%, чтобы остановить обычный синтаксический анализ PowerShell.

build --% App Target "/p:Property=Value"
0 голосов
/ 04 октября 2014

Кажется, что только одиночные кавычки вокруг двойных кавычек могут быть лучшими для нескольких сценариев в среде Windows. Следующая ссылка от MS показывает его поддержку (или ограничение) знака равенства http://support.microsoft.com/kb/35938 Он специфичен для пакетных файлов, но, вероятно, влияет на многие другие продукты оболочки MS.

0 голосов
/ 09 февраля 2011

Вы пробовали одинарные кавычки, чтобы вызвать буквальное толкование?

Или: cmd / c 'msbuild.exe App.msbuild / t: Target "/ p: Свойство = Значение"'

0 голосов
/ 09 февраля 2011

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