Параметризация значений вызывает ошибку в команде powershell / msbuild

#powershell #msbuild #powershell-5.0

#powershell #msbuild #powershell-5.0

Вопрос:

У меня есть сценарий powershell, который, в свою очередь, вызывает msbuild.exe и запускает ее со значением решения и аргументом parameters. Если я запускаю этот скрипт, записывая строку вручную, он выполняется должным образом и создает решение, однако, из-за того, что этот скрипт предназначен для создания нескольких решений, параметры, путь к файлу решения и путь к msbuild передаются как переменные.

Строка, которую мне нужно запустить, выглядит следующим образом:

 amp; 'C:Program Files (x86)Microsoft Visual Studio2017BuildToolsMSBuild15.0BinMSBuild.exe' FooBar.sln "/t:rebuild" /p:PlatformTarget=AnyCPU /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:agent_work1sDeploy.TempFoo.Bar.Binaries\ | Out-Host 
  

И способ ее разделения на переменные заключается в следующем:

 $1 = 'C:Program Files (x86)Microsoft Visual Studio2017BuildToolsMSBuild15.0BinMSBuild.exe'
$2 = 'FooBar.sln'
$3 = "/t:rebuild /p:PlatformTarget=AnyCPU /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:agent_work1sDeploy.TempFoo.Bar.Binaries\ | Out-Host"


amp; $1 $2 $3
  

Для контекста, чтобы получить эти значения, мы используем XML со многими узлами с 3 свойствами для каждого.

Ошибка, которую я получаю при запуске параметризованного сценария, заключается в следующем:

 Unhandled Exception: System.ArgumentException: The name "Foo_Bar:PlatformTarget=AnyCPU /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:agent_work1sDeploy.TempFoo.bar.Binaries\ | Out-Host" contains 
an invalid character ".".

  

Очевидно, это связано с тем, как powershell обрабатывает строки, но я не могу понять, как заставить это работать.

Ответ №1:

| Out-Host не должно передаваться как часть аргумента приложению — но проблема здесь не в этом.

Похоже, что это комбинация объединения всех переключателей командной строки в одной строке и наличия . в любом месте указанного аргумента — если я разделю строку на отдельные части или заменю ваш OutDir аргумент путем, который не содержит ни одного . , msbuild продолжится попытка создания проектов:

 $msbuild = 'C:Program Files (x86)Microsoft Visual Studio2017BuildToolsMSBuild15.0BinMSBuild.exe'
$solution = 'FooBar.sln'
$arguments = "/t:rebuild /p:PlatformTarget=AnyCPU /p:Configuration=Release /p:DeployOnBuild=true /p:CustomizablePublishDir=true /p:OutDir=F:agent_work1sDeploy.TempFoo.Bar.Binaries"

amp;$msbuild $solution $arguments.Split(' ') |Out-Host
  

Комментарии:

1. Можете ли вы объяснить, почему | Out-Host не следует передавать приложению? И почему это работает, если не должно? Использование $argument.Split(' ') , похоже, сработало! Большое вам спасибо за помощь.

2. Потому что Out-Host это командлет powershell, а не допустимый аргумент для msbuild .