Как передать знак равенства при вызове пакета 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.