2

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

这是重要的代码:

[...]

# 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.")
  }
}

[...]

我没有$procWeb.ExitCode上 Windows7 Powershell。在 Win8 上它工作得很好并且安装source_one并且source_two只有在第一个成功的情况下。

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

提前谢谢了。

4

1 回答 1

1

您的问题被确定为 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.")
  }
}

在此处找到有关该错误的详细信息

于 2015-07-31T20:07:21.080 回答