通过MSI无法自动卸载服务

时间:2013-06-14 19:34:50

标签: powershell windows-services windows-installer build-automation powershell-remoting

我正在编写一个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),但我不完全确定。我在卸载时没有得到日志文件,但安装会写入日志文件。

2 个答案:

答案 0 :(得分:0)

Enter-PSSession仅用于交互式使用,不适用于脚本。因此,基本上,您的脚本在Enter-PSSession $session之后停止工作。

从脚本中删除以下行,所有内容都应按预期工作。

 # Enter session
    Enter-PSSession $session

  # Close session    
    Exit-PSSession

您需要的只是Invoke-Command

答案 1 :(得分:0)

实际上,我想出了这个问题。当它应该只是/ x标志时,我在参数中留下了/ i标志。现在工作正常。

即使qn标志传递给它,该标志也是msiexec抛出错误页面。不确定它是否应该这样做。