2

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

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

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

我希望能够做这些事情。

  • 从调用的脚本块代码中收集输出(stdout 和 stderr)。
  • 如果其中的代码是作为布尔值(或)$?的 powershell 代码,则获取调用的脚本块的状态(例如)。$True$False
  • $LASTEXITCODE如果其中的代码是 Int32 形式的外部命令(0 表示成功,!0 表示失败),则获取调用的 scriptnlock 的状态(例如)。
  • 允许这适用于 PowerShell >= 2.0。

这可能吗?

4

1 回答 1

4

从单个脚本块的角度来看:

$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
}
于 2013-10-02T23:41:55.890 回答