Есть ли хорошие задачи PowerShell MSBuild?

Кто-нибудь знает какие-нибудь хорошие задачи MSBuild, которые будут выполнять сценарий PowerShell и передавать ему разные параметры?

Мне удалось найти Блог B # .NET: вызов сценариев PowerShell из MSBuild, но я надеюсь на что-то более отполированное.

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

Я бы использовал сообщение в блоге как начало. Мы работаем с консультантом из Microsoft, и он нас порекомендовал. Я попробовал задачу Powershell MSBuild на codeplex, и она выявила ошибку в моем сценарии Powershell, который работает в задаче, созданной Барт Де Смет.

Scott Lawrence 22.01.2010 17:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
6 615
4

Ответы 4

Вы также можете посмотреть Псаке - среду сборки на основе PowerShell.

Можно использовать http://powershellmsbuild.codeplex.com/ для 3.5. Было бы неплохо, если бы для него был пакет NuGet, который можно было бы использовать с помощью восстановления пакета NuGet..

4.0 имеет Фабрика задач Windows Powershell, в который был добавлен можно получить в галерее кодаПакет расширений MSBuild (одна из лучших библиотек задач - 400+ задач и рекомендуется во внутренней части MSBuild) имеет PowerShellTaskFactory (загрузите файл справки с раздел загрузки этого примера выпуска, чтобы посмотреть).

Лучше было бы функциональное подмножество PowerShell, поставляемое Microsoft (не хотелось бы, чтобы неограниченные побочные эффекты мешали декларативному характеру файлов проекта и обнаружению изменений msbuild). Существующий Функции собственности кажется началом этого (по крайней мере, у них есть синтаксис PowerShell)

unbob 17.09.2018 23:30

Повторяющийся вопрос и ответ, который я отправил, здесь для потомков, когда проголосовали за закрытие. Ключевое отличие состоит в том, что этот вопрос был ограничен OOTB, и мой ответ остается в рамках этого ограничения.

Вопрос

Похоже, что у Powershell нет простого способа вызвать его с помощью произвольной команды, а затем всплывать ошибки синтаксического анализа и выполнения таким образом, чтобы правильно взаимодействовать с вызывающими объектами, которые не являются PowerShell, например cmd.exe, TeamCity и т. д.

У меня простой вопрос. Какой для меня лучший способ с OOTB MSBuild v4 и PowerShell v3 (открыт для предложений - не исключает подходящую готовую задачу MSBuild, но это должно быть немного сильнее, чем предложение «это просто - взять образец PowerShell Task Factory и настроить его и / или стать его сопровождающим / родителем ") для запуска команды (либо небольшого сегмента сценария, либо (чаще всего) вызова сценария .ps1.

Я думаю, это должно быть что-то нормальное, например:

<Exec 
  IgnoreStandardErrorWarningFormat = "true"
  Command = "PowerShell &quot;$(ThingToDo)&quot;" />

К сожалению, это не работает: -

  1. если ThingToDo не может выполнить синтаксический анализ, он не будет работать без предупреждения
  2. если ThingToDo - это вызов сценария, которого не существует, он не выполняется
  3. если вы хотите воспроизвести результат ERRORLEVEL на основе .cmd, он становится волосатым
  4. если вы хотите встроить кавычки " в 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 -&amp; 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>

Примечания:

  • Вы по-прежнему можете использовать стандартные функции Exec Task! (см .: https://msdn.microsoft.com/en-us/library/x8zx72cd.aspx)
  • если ваш сценарий 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.

unbob 17.09.2018 23:25

Другие вопросы по теме