我正在编写一个 powershell 脚本,通过生成的 MSI 将 .NET 4 Windows 服务部署到 2008 服务器。全新安装运行良好,但是当我重新运行并尝试卸载它时,脚本在尝试卸载时挂起。我调用 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),但我并不完全确定。我在卸载时没有得到日志文件,但安装会写入日志文件。