如何收集标准,$?和来自包含任何代码的脚本块的$ LASTEXITCODE

时间:2013-10-02 19:31:01

标签: powershell powershell-v2.0 powershell-v3.0

我在一台机器上执行了一系列“任务”,这些任务在powershell脚本块中定义,如下所示(它们实际上是作为包含脚本块的更复杂的哈希数组传入的)。

$Tasks = @(
  { hostname.exe },
  { Get-PowerShellFunction },
  { (GWMI Win32_OperatingSystem).Version -imatch '6.1' },
  { Get-PowerShellFunction },
  { cmd /c "smth && exit 45" }     
)

这些任务是使用$Tasks[$i].Invoke()调用的,但已经意识到我无法报告任务的状态,因为似乎没有可靠的方法来检查和使用$?和/或{{1在$LASTEXITCODE

之后

我希望能够做这些事情。

  • 从调用的scriptblock代码中收集输出(stdout和stderr)。
  • 获取调用的scriptblock的状态(例如.Invoke()),如果其中的代码是PowerShell代码作为布尔值($?$True)。
  • 获取被调用的scriptnlock的状态(例如$False),如果其中的代码是Int32的外部命令(0表示成功,0表示失败)。
  • 允许此功能用于PowerShell> = 2.0。

这可能吗?

1 个答案:

答案 0 :(得分:4)

从单个scriptblock的角度来看:

$sb = { hostname.exe }
$result = @{}
$result.out = & $sb
$result.status = $?
$result.exitcode = $LASTEXITCODE

如果您然后转出$results以检查属性:

PS C:\> $results

Name                           Value
----                           -----
exitcode                       0
out                            POSHVM7
status                         True

循环遍历$tasks中的脚本块,您可能只会附加一系列结果:

$results = @()
$Tasks | % {
  $result = @{}
  $result.out = & $_
  $result.status = $?
  $result.exitcode = $LASTEXITCODE
  $results += $result
}