Кто-нибудь знает какие-нибудь хорошие задачи MSBuild, которые будут выполнять сценарий PowerShell и передавать ему разные параметры?
Мне удалось найти Блог B # .NET: вызов сценариев PowerShell из MSBuild, но я надеюсь на что-то более отполированное.
Если я ничего не смогу найти, я, конечно, просто продолжу и доработаю свой собственный, используя этот пост в блоге в качестве начала.





Вы также можете посмотреть Псаке - среду сборки на основе PowerShell.
Можно использовать http://powershellmsbuild.codeplex.com/ для 3.5. Было бы неплохо, если бы для него был пакет NuGet, который можно было бы использовать с помощью восстановления пакета NuGet..
4.0 имеет Фабрика задач Windows Powershell, в который был добавлен можно получить в галерее кодаПакет расширений MSBuild (одна из лучших библиотек задач - 400+ задач и рекомендуется во внутренней части MSBuild) имеет PowerShellTaskFactory (загрузите файл справки с раздел загрузки этого примера выпуска, чтобы посмотреть).
Лучше было бы функциональное подмножество PowerShell, поставляемое Microsoft (не хотелось бы, чтобы неограниченные побочные эффекты мешали декларативному характеру файлов проекта и обнаружению изменений msbuild). Существующий Функции собственности кажется началом этого (по крайней мере, у них есть синтаксис PowerShell)
Повторяющийся вопрос и ответ, который я отправил, здесь для потомков, когда проголосовали за закрытие. Ключевое отличие состоит в том, что этот вопрос был ограничен OOTB, и мой ответ остается в рамках этого ограничения.
Похоже, что у Powershell нет простого способа вызвать его с помощью произвольной команды, а затем всплывать ошибки синтаксического анализа и выполнения таким образом, чтобы правильно взаимодействовать с вызывающими объектами, которые не являются PowerShell, например cmd.exe, TeamCity и т. д.
У меня простой вопрос. Какой для меня лучший способ с OOTB MSBuild v4 и PowerShell v3 (открыт для предложений - не исключает подходящую готовую задачу MSBuild, но это должно быть немного сильнее, чем предложение «это просто - взять образец PowerShell Task Factory и настроить его и / или стать его сопровождающим / родителем ") для запуска команды (либо небольшого сегмента сценария, либо (чаще всего) вызова сценария .ps1.
Я думаю, это должно быть что-то нормальное, например:
<Exec
IgnoreStandardErrorWarningFormat = "true"
Command = "PowerShell "$(ThingToDo)"" />
К сожалению, это не работает: -
ThingToDo не может выполнить синтаксический анализ, он не будет работать без предупрежденияThingToDo - это вызов сценария, которого не существует, он не выполняетсяERRORLEVEL на основе .cmd, он становится волосатым" в ThingToDo, это не сработаетИтак, каким должен быть пуленепробиваемый способ запуска PowerShell из MSBuild? Можно что-нибудь PsGet, чтобы все ОК?
Weeeeelll, вы можете использовать что-то вроде этого длинного, пока не найдете лучший способ: -
<PropertyGroup>
<__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
<__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
<__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
<_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</_PsCmdStart>
<_PsCmdEnd>$(__BlockEnd)"</_PsCmdEnd>
</PropertyGroup>
И тогда все, что вам нужно сделать, это:
<Exec
IgnoreStandardErrorWarningFormat = "true"
Command = "$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />
Единственная полезная особенность этого (кроме перехвата всех типов ошибок, о которых я мог думать) заключается в том, что он работает OOTB с любой версией PowerShell и любой версией MSBuild.
Я возьму пальто.
Немного повеселившись, мне удалось придумать довольно простой способ сделать эту работу:
<?xml version = "1.0" encoding = "utf-8"?>
<Project ToolsVersion = "4.0" xmlns = "http://schemas.microsoft.com/developer/msbuild/2003">
<!-- #1 Place this line at the top of any msbuild script (ie, csproj, etc) -->
<PropertyGroup><PowerShell># 2>nul || type %~df0|find /v "setlocal"|find /v "errorlevel"|powershell.exe -noninteractive -& exit %errorlevel% || #</PowerShell></PropertyGroup>
<!-- #2 in any target you want to run a script -->
<Target Name = "default" >
<PropertyGroup> <!-- #3 prefix your powershell script with the $(PowerShell) variable, then code as normal! -->
<myscript>$(PowerShell)
#
# powershell script can do whatever you need.
#
dir ".\*.cs" -recurse |% {
write-host Examining file named: $_.FullName
# do other stuff here...
}
$answer = 2+5
write-host Answer is $answer !
</myscript>
</PropertyGroup>
<!-- #4 and execute the script like this -->
<Exec Command = "$(myscript)" EchoOff = "true" />
</Target>
</Project>
если ваш сценарий PowerShell должен использовать символы <> или &, просто поместите содержимое в оболочку CDATA:
<script2><![CDATA[ $(PowerShell)
# your powershell code goes here!
write-host "<<Hi mom!>>"
]]></script2>
если вы хотите вернуть элементы в скрипт msbuild, вы можете получить их:
<script3>$(PowerShell)
# your powershell code goes here!
(dir "*.cs" -recurse).FullName
</script3>
<Exec Command = "$(script3)" EchoOff = "true" ConsoleToMSBuild = "true">
<Output TaskParameter = "ConsoleOutput" PropertyName = "items" />
</Exec>
<Touch Files = "$(items)" />
Видеть! тогда вы можете использовать эти элементы с другой задачей msbuild: D
Мне это нравится. Я видел похожийвещи, сделанный Валидом Туми вне msbuild (и использовал их для хорошего эффекта). Спасибо, что нашли время на отладку мелочей. Идея проста, я предполагаю, что заставить ее работать на самом деле могло и не получиться (или вам может повезти или вам повезет :-) В моей среде мне нужно было добавить -executionpolicy remotesigned.
Я бы использовал сообщение в блоге как начало. Мы работаем с консультантом из Microsoft, и он нас порекомендовал. Я попробовал задачу Powershell MSBuild на codeplex, и она выявила ошибку в моем сценарии Powershell, который работает в задаче, созданной Барт Де Смет.