为什么 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_one
和 source_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
我正在尝试编写一个脚本来在多台计算机上安装软件。问题是,它们必须按特定顺序安装,我需要知道第一个安装成功之前 运行 第二个。
这是重要的代码:
[...]
# 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_one
和 source_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