[英]Run powershell script during MSBuild
我有一个.NET Framework 4.5.2 WebAPI2项目。 在Visual Studio中构建项目时,我希望在每次构建之前都运行我编写的Powershell脚本。 如果powershell脚本以任何非零代码退出,我希望构建失败,并且来自powershell脚本的错误消息在Visual Studio输出中可见。
到目前为止,这是我修改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 "& { $(ScriptLocation) } "" />
</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
通过更改以下内容,我可以使所有工作正常进行。 这基于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 "& { .\MyScript.ps1 } "" LogStandardErrorAsError="True" ContinueOnError="False" WorkingDirectory="C:\Code" />
</Target>
对我来说,包含PowerShellExe和ScriptLocation变量都导致错误。 删除这些行并剥离Exec行即可解决此问题。 包含'ContinueOnError =“ False”'和'LogStandardErrorAsError =“ True”'可确保如果Powershell脚本抛出非零退出代码,则构建过程将停止。
我如下编辑目标名称=“ 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 "& { $(ScriptLocation) } "" />
</Target>
(已编辑为在Windows中添加“ s”)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.