#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
.