Запустить скрипт powershell во время MSBuild - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть проект .NET Framework 4.5.2 WebAPI2.При создании проекта в Visual Studio я хочу, чтобы сценарий powershell, который я написал, выполнялся перед каждой сборкой.Если сценарий powershell завершается с любым ненулевым кодом, я хочу, чтобы сборка завершилась неудачно, и сообщение об ошибке из сценария powershell, видимое в выходных данных Visual Studio.

Вот как я изменил свой файл csproj так,far:

<Project ToolsVersion="12.0" DefaultTargets="MyCustomTarget;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<Target Name="MyCustomTarget">
  <PropertyGroup>
    <PowerShellExe Condition=" '$(PowerShellExe)'=='' "> 
      %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
    </PowerShellExe>
    <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
      C:\Code\MyScript.ps1
    </ScriptLocation>
  </PropertyGroup>
  <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted -command &quot;&amp; { $(ScriptLocation) } &quot;" />
</Target>

Для простоты мой скрипт выглядит следующим образом:

if(((get-date -Format "mm") % 2) -eq 0){ exit 0 } else { write-error "The minute is not equally divisible by 2.";exit 1 }

Однако, когда я собираюсь построить проект, я теперь вижу свой скрипт powershell, открытый в блокноте исборка останавливается, пока я не закрою блокнот.После закрытия я получаю сообщение об ошибке и не могу найти способ ее устранения.Любая помощь будет высоко ценится.

The command " 
    %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
   -NonInteractive -executionpolicy Unrestricted -command "& { 
    C:\Code\MyScript.ps1
   } "" exited with code 9009.  MyWebApi2Project    C:\Code\MySolution\MyWebApi2Project\MyWebApi2Project.csproj 269 

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Мне удалось заставить все работать, изменив следующее.Это основано на ответе Апурвы:

<Target Name="BeforeBuild">
  <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" /><!-- existing line, not part of answer -->
  <Exec Command="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -executionpolicy Unrestricted -command &quot;&amp; { .\MyScript.ps1 } &quot;" LogStandardErrorAsError="True" ContinueOnError="False" WorkingDirectory="C:\Code" />
</Target>

Для меня включение переменных PowerShellExe и ScriptLocation вызывало ошибку.Удаление этих строк и удаление строки Exec исправили проблему.Включение 'ContinueOnError = "False"' и "LogStandardErrorAsError =" True "" гарантировало, что процесс сборки будет остановлен, если сценарий powershell бросит ненулевой код завершения.

0 голосов
/ 21 сентября 2018

Я изменил Target Name = "BeforeBuild", как показано ниже, вместо создания новой Target.Таким образом, перед запуском сборки выполняется сценарий powershell и, соответственно, выполняется или не выполняется сборка

<Target Name="BeforeBuild">
   <PropertyGroup>
    <PowerShellExe Condition=" '$(PowerShellExe)'=='' "> 
     C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    </PowerShellExe>
    <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
      C:\Code\MyScript.ps1
    </ScriptLocation>
  </PropertyGroup>
  <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted -command &quot;&amp; { $(ScriptLocation) } &quot;" />
  </Target>

(отредактировано для добавления 's' в окна)

...