生成された MSI を介して .NET 4 Windows サービスを 2008 サーバーに展開するための powershell スクリプトを作成しています。新規インストールは正常に実行されますが、再実行してアンインストールしようとすると、アンインストール中にスクリプトがハングします。ターゲット マシンで実行される msiexec を呼び出します (アンインストールの実行中にプロセスが開始されたことを確認できます)。アンインストール コードとインストール コードの唯一の違いは、ログ名と msiexec に渡される /x コマンドです。
これが私が持っているコードです:
function UninstallService ($serverName, $fileName)
{
write "Start uninstall service."
$msiNamePath = "C:\MsiDeployment\" + $fileName
$processArgs = @("/i", $msiNamePath, "/x", "/qn", "/norestart", "/l", "c:\msiuninstall.log")
# Create session
$session = New-PSSession -ComputerName $serverName
# Enter session
Enter-PSSession $session
# Do uninstall
Invoke-Command -Session $session -ScriptBlock { param($pArgs,$rootDir) Start-Process -FilePath "$rootDir\msiexec.exe" -ArgumentList $pArgs -Wait } -Args $processArgs,("$env:systemroot\system32")
# Close session
Exit-PSSession
Remove-PSSession $session
if (!$?) { throw "Could not uninstall the service remotely on machine " + $serverName }
write "End uninstall service."
}
サーバーで実行中の msiexec を終了すると、スクリプトは処理を続行します (サービスがアンインストールされているかどうかを確認するために後で失敗します)。ユーザー入力(おそらくUAC)を探しているプロンプトがあると思いますが、完全にはわかりません。アンインストールではログ ファイルが取得されませんが、インストールではログ ファイルが書き込まれます。