web-dev-qa-db-ja.com

PowerShellを介してcmdコマンドを実行するための終了コードを見つける

サイレントインストールコマンドを使用してソフトウェアをインストールしています。このコマンドはPowerShell3.0から実行しています。

$silentInstall = C:\Users\Admin\Documents\Setup-2.0.exe exe /s /v"EULAACCEPTED=\"Yes\" /l*v c:\install.log /qn"

Invoke-Expression $silentInstall

これにより、ソフトウェアをインストールするコマンドが実行されますが、コマンドが完了するのを待たずに、次のコード行に進みます。インストールが完了したかどうかがわかるように、インストールを制御したいと思います。

Invoke-Expression コマンドレットのエラーコードを取得して、cmdが正常に実行されたかどうかを確認するにはどうすればよいですか?

7
user3543477

MSIインストーラーを実行しているようです。コンソールから実行すると、MSIがインストーラーを実行するための新しいプロセスをフォークしている間、制御はすぐに返されます。この動作を変更する方法はありません。

おそらく行う必要があるのは、Get-Processを使用してmsiexecという名前のプロセスを見つけ、それが完了するのを待つことです。新しいインストーラーの開始を処理するmsiexecプロセスが常に実行されているため、インストールの開始後に開始されたmsiexecプロセスを見つける必要があります。

$msiexecd = Get-Process -Name 'msiexec'
C:\Users\Admin\Documents\Setup-2.0.exe exe `
                                       /s `
                                       /v"EULAACCEPTED=\"Yes\" /l*v c:\install.log /qn"
$myMsi = Get-Process -Name 'msiexec' | 
             Where-Object { $_.Id -ne $msiexecd.Id }
$myMsi.WaitForExit()
Write-Verbose $myMsi.ExitCode
3
Aaron Jensen

それはEXEファイルがどのように実行されるかに依存します-時々それは別のプロセスを開始してすぐに戻ります、そしてそのような場合これは通常うまくいきます-

$p = Start-Process -FilePath <path> -ArgumentList <args> -Wait -NoNewWindow -PassThru
$p.ExitCode

それ以外の場合、これは通常機能します-

& <path> <args>
$LASTEXITCODE

または時々これ-

& cmd.exe /c <path> <args>
$LASTEXITCODE
21
Andy Arismendi

Invoke-Expressionを使用する必要はありません。

& C:\Users\Admin\Documents\Setup-2.0.exe /s /vEULAACCEPTED=Yes /l*v C:\install.log /qn
3
Bill_Stewart