サイレントインストールコマンドを使用してソフトウェアをインストールしています。このコマンドは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が正常に実行されたかどうかを確認するにはどうすればよいですか?
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
それはEXEファイルがどのように実行されるかに依存します-時々それは別のプロセスを開始してすぐに戻ります、そしてそのような場合これは通常うまくいきます-
$p = Start-Process -FilePath <path> -ArgumentList <args> -Wait -NoNewWindow -PassThru
$p.ExitCode
それ以外の場合、これは通常機能します-
& <path> <args>
$LASTEXITCODE
または時々これ-
& cmd.exe /c <path> <args>
$LASTEXITCODE
Invoke-Expressionを使用する必要はありません。
& C:\Users\Admin\Documents\Setup-2.0.exe /s /vEULAACCEPTED=Yes /l*v C:\install.log /qn