Powershell 脚本 - Start-Job & MSIEXEC



我想知道你能不能帮忙?我需要编写一个Powershell脚本来执行MSI脚本。

我还需要在这个过程中设置一个超时(因为我们得到的MSIs有时会挂起)。

我已经看到,你可以通过使用启动作业/等待作业过程来实现这一点

显然,下面的代码目前处于严重的屠宰状态

提前感谢

    $timeoutSeconds = 20
$uninstall32    = gci "HKLM:SOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall" | foreach { gp $_.PSPath } | ? { $_ -match "My File" } | select UninstallString$uninstall64    = gci "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionUninstall" | foreach { gp $_.PSPath } | ? { $_ -match "Vix.Cbe.SalesTransaction" } | select UninstallString
Echo  "uninstall32 :" $uninstall32
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
$32p = @("/X", "$uninstall32", "/b")
}
Echo  "uninstall32 :" $uninstall32
Echo  "u32 :" $32p

$32j = Start-Job msiexec  -ArgumentList $32p
if (Wait-Job $32j -Timeout $timeoutSeconds) { Receive-Process $32j }
Remove-Process -force $32j

您不必为了做到这一点而打乱作业。这是一个简单的方法:

start Notepad -PassThru | select -ExpandProperty id | set id
sleep 60
kill $id -ea 0

如果应用程序生成另一个应用程序并退出,则这可能不起作用,因为Id将是错误的。在这种情况下,您可能必须在进程列表中或通过cmd行params查找它。

多亏了majkinator,我成功地对代码进行了充分的修改,实现了我的目标。

唯一的问题是,无论进程是否仍在主动卸载,它都会在TOSecs值之后被杀死。

这应该足够满足我的需要了。

因此,为其他寻找类似解决方案的人解释一下:

此过程检查32位和64位注册表项中是否存在类似于ServiceName的MSI(Urbancode Deploy参数是在运行时传递给脚本的"${p:ServiceName}")

如果它找到一个条目,它将执行特定32/64 MSI 的卸载代码

/x=卸载

$uninstall64/32=MSI 的卸载部分的GUID

/nq=没有GUI的安静卸载(在隔离测试中,你会得到一个是/否对话框)

卸载将运行您在$TOSecs 中设置的秒数

希望这能帮助其他

$TOSecs      = 30
$uninstall32 = gci "HKLM:SOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall" | foreach { gp $_.PSPath } | ? { $_ -match "'${p:ServiceName}'" } | select UninstallString
$uninstall64 = gci "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionUninstall" | foreach { gp $_.PSPath } | ? { $_ -match "'${p:ServiceName}'" } | select UninstallString
if ($uninstall64) {
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall64 = $uninstall64.Trim()
Write "Uninstalling 64bit " '${p:ServiceName}'
start-process "msiexec.exe" -arg "/X $uninstall64 /nq" -PassThru | 
select -ExpandProperty id | set id
#Echo "proc id = "$id
sleep $TOSecs
kill $id -ea 0
}
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling 32bit " '${p:ServiceName}'
start-process "msiexec.exe" -arg "/X $uninstall32 /nq" -PassThru | 
select -ExpandProperty id | set id
#Echo "proc id = "$id
sleep $TOSecs
kill $id -ea 0
}

相关内容

  • 没有找到相关文章

最新更新