PowerShell退出代码-从MSBuild调用 [英] PowerShell exit code - Calling from MSBuild
问题描述
我正在从MSBuild调用PowerShell脚本. MSBuild能够捕获返回的输出,但认为该项目已成功构建.
I'm invoking a PowerShell script from MSBuild. MSBuild is able to capture the output returned, but thinks the project is built successfully.
问题在于,PowerShell的退出代码未传递给MSBuild中的命令.有人曾经尝试过此方法,并且能够向MSBuild抛出退出代码吗?
The problem is that the exit code from PowerShell is not passed to the command in MSBuild. Has someone tried this before and been able to throw an exit code to MSBuild?
testmsbuild.proj
testmsbuild.proj
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ScriptLocation>c:\scripts\test.ps1</ScriptLocation>
</PropertyGroup>
<Target Name="AfterDropBuild" >
<Exec Command="powershell.exe -NoProfile -Noninteractive -command "& { $(ScriptLocation)%3Bexit $LASTEXITCODE }" " >
<Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
</Exec>
</Target>
</Project>
test.ps1(当然这会出错)
test.ps1 (of course this is going to error out)
function CallFromMSBuild {
Invoke-command {Powershell.exe C:\a.ps1} -computername $computers
}
触发MSBuild项目时,它应该已经发现了问题,并且构建应该失败了(考虑到构建成功了)
When MSBuild project is triggered, it should have caught the issue and the build should have failed (considers build succeeded instead)
当我从MSBuild拨打电话
When I call from MSBuild
C:\Scripts>msbuild testmsbuild.proj /t:AfterDropBuild
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.225]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
Build started 4/28/2011 2:46:29 PM.
Project "C:\scripts\testmsbuild.proj" on node 1 (AfterDropBuild target(s)).
AfterDropBuild:
powershell.exe -NoProfile -Noninteractive -command "& { c:\scripts\test.ps1;e
xit $LASTEXITCODE }"
Invoke-Command : Cannot validate argument on parameter 'ComputerName'. The argu
ment is null or empty. Supply an argument that is not null or empty and then tr
y the command again.
At C:\install\test.ps1:3 char:58
+ Invoke-command {Powershell.exe C:\a.ps1} -computername <<<< $computers
+ CategoryInfo : InvalidData: (:) [Invoke-Command], ParameterBind
ingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Power
Shell.Commands.InvokeCommandCommand
Done Building Project "C:\scripts\testmsbuild.proj" (AfterDropBuild target(s)).
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:01.04
推荐答案
将exit $lastexitcode
添加到test.ps1
Add exit $lastexitcode
to test.ps1
评论后:
在test.ps1中尝试一下:
Try this in test.ps1:
trap {Write-Host -foreground red $_.Exception.Message; exit 1; continue} Invoke-command {Powershell.exe C:\a.ps1} -computername $computers
基本上,我认为这里的MSBuild没有错.
Basically, I don't think MSBuild is at fault here.
我尝试了错误的Invoke-Command
,即使调用命令失败,$lastexitcode
也被设置为0!您可以通过执行echo %errorlevel%
来从cmd本身测试这是否有效,并看到得到1.
I tried your wrong Invoke-Command
and the $lastexitcode
was set to 0 even though the Invoke-Command had failed! You can test whether this works or not from cmd itself by doing echo %errorlevel%
and see you get 1.
这篇关于PowerShell退出代码-从MSBuild调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!