为什么 Powershell 在 Windows 7 上不返回 ExitCode

Why is Powershell returning no ExitCode on Windows 7

我正在尝试编写一个脚本来在多台计算机上安装软件。问题是,它们必须按特定顺序安装,我需要知道第一个安装成功之前 运行 第二个。

这是重要的代码:

[...]

# source_one
$Argumente = @("/i", $path_to_source, "/qb", "ADDLOCAL=ALL")
if (!$visWeb_upToDate)    { 
  Write("VIS Web-Client Installation...")
  $procWeb = Start-Process msiexec.exe -ArgumentList $Argumente -Verb runAs -PassThru 
  $procWeb.WaitForExit()
  Write-Debug($procWeb.ExitCode)

  if ($procWeb.ExitCode -eq 0){
    Write("... erfolgreich.")
    $visWeb_upToDate = $true;
  }
  else {
    Write-Error("... nicht erfolgreich.")
    Write-Error("Bitte Clients manuell installieren.")
  }
}

# source_two
if ($visWeb_upToDate -and !$vis64_upToDate){
  Write("VIS 64-Bit Client Installation...")
  $Argumente[1] = $path_to_another_source
  $procWeb64 = Start-Process msiexec.exe -ArgumentList $Argumente -Verb runAs -PassThru 
  $procWeb64.WaitForExit()
  Write-Debug($procWeb64.ExitCode)

  if ($procWeb64.ExitCode -eq 0){
    Write("... erfolgreich.")
    $vis64_upToDate = $true
  }
  else {
    Write-Error("... nicht erfolgreich.")
    Write-Error("Bitte 64-Bit Client manuell installieren.")
  }
}

[...]

我在 Windows7 Powershell 上没有得到 $procWeb.ExitCode。在 Win8 上它工作得很好并且只在第一个成功时安装 source_onesource_two

有人知道如何解决这个问题,或者 有没有其他方法可以为两个系统设置 $visWeb_upToDate = $true

非常感谢。

您的问题被确定为 powershell 中的错误。

您可以获得退出代码,但只能在调用进程的 .HasExited 属性 并使用奇怪的语法后才能获得。

因此,例如将代码更改为:

if ($procWeb.HasExited -and ($procWeb.GetType().GetField("exitCode", "NonPublic,Instance").GetValue($procWeb)) -eq 0){
  Write("... erfolgreich.")
  $visWeb_upToDate = $true;
}
  else {
    Write-Error("... nicht erfolgreich.")
    Write-Error("Bitte Clients manuell installieren.")
  }
}

查找错误的详细信息here