gpt4 book ai didi

PowerShell 退出代码 - 从 MSBuild 调用

转载 作者:行者123 更新时间:2023-12-02 22:57:36 25 4
gpt4 key购买 nike

我正在从 MSBuild 调用 PowerShell 脚本。 MSBuild 能够捕获返回的输出,但认为项目已成功构建。

问题在于 PowerShell 的退出代码未传递给 MSBuild 中的命令。以前是否有人尝试过此操作并能够向 MSBuild 抛出退出代码?

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 &quot;&amp; { $(ScriptLocation)%3Bexit $LASTEXITCODE }&quot; " >
<Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
</Exec>
</Target>

</Project>

test.ps1(当然这会出错)

function CallFromMSBuild {

Invoke-command {Powershell.exe C:\a.ps1} -computername $computers
}

当 MSBuild 项目被触发时,它应该已经捕获了问题并且构建应该失败(而是认为构建成功)

当我从 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

最佳答案

这个问题是主要搜索引擎上的最佳答案。 best answer is this来自 James Kovacs(他很有名 - 也就是说,他在 PowerShell 和 MSBuild 集成方面有点 FizzBinned)。

总而言之,在 ps1 文件中:

  1. 粘贴$ErrorActionPreference='Stop'位于脚本顶部,因此它不是默认值,即 SilentlyContinue (已接受答案中的 trap 位具有相同的效果,但更加间接和困惑)
  2. 坚持他的function exec {... (或使用 psake 本身)
  3. 将外部 EXE 的调用包装在 exec { x.exe }
  4. 不需要做任何明确的exit ...东西

默认错误处理将异常向上传播为 ERRORLEVEL 1 来自 powershell.exe myscript.ps1 ,即在 MSBuild <Exec 中您不需要做任何欺骗来告诉它忽略退出代码等(除非您想对特定退出代码做一些有条件的事情,其中​​您想要执行 IgnoreExitCode="true" 并使用 <Output 元素捕获它)

最后一件需要理解的重要事情是,在 PowerShell 中,有一个 $?这是最后一个表达式的结果(如果您处于 ErrorAction='Stop' 模式则不相关),它会随着您所做的每件事而变化,而 $LastExitCode 是系统中触发的最后一个 .exe 的“DOS”退出代码。 Details here - be sure to read the comments

关于PowerShell 退出代码 - 从 MSBuild 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5824208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com