2015-07-31 2 views
2

Я пытаюсь написать скрипт для установки программного обеспечения на многих компьютерах. Проблема в том, что они должны быть установлены в определенном порядке, и мне нужно знать, что первая установка удалась, прежде чем запускать вторую.Почему Powershell не возвращает ExitCode в 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.") 
    } 
} 

[...] 

Я не получаю $procWeb.ExitCode на Windows7 Powershell. На Win8 он отлично работает и устанавливает source_one и source_two только на успех первого.

Кто-нибудь знает, как это исправить, или есть ли другой способ установить $visWeb_upToDate = $true для обеих систем?

Большое спасибо заранее.

ответ

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

Найти детали на ошибку here

+0

прямо сейчас, я пытаюсь ваше предложение. Сейчас это работает. через несколько минут я увижу, работает ли это для каждого отдельного случая. – chrosey