在MSBuild期间运行Powershell脚本

时间:2018-09-20 20:49:29

标签: asp.net powershell msbuild csproj msbuild-task

我有一个.NET Framework 4.5.2 WebAPI2项目。在Visual Studio中构建项目时,我希望在每次构建之前都运行我编写的Powershell脚本。如果powershell脚本以任何非零代码退出,则我希望构建失败,并且在Visual Studio输出中可见来自powershell脚本的错误消息。

到目前为止,这是我修改csproj文件的方式:

<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 :(得分:1)

通过更改以下内容,我能够使所有工作正常进行。这是建立在Apoorva的答案之上的:

<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脚本抛出非零退出代码时,构建过程将停止。

答案 1 :(得分:0)

我如下编辑了目标名称=“ BeforeBuild”,而不是创建新的目标。因此,在开始构建之前,将执行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>

(已编辑以在Windows中添加“ s”)