首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell脚本-开始-作业& MSIEXEC

Powershell脚本-开始-作业& MSIEXEC
EN

Stack Overflow用户
提问于 2016-04-01 11:16:57
回答 2查看 1K关注 0票数 0

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

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

我已经看到,您可以通过使用Start-作业/等待-作业过程来实现这一点。

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

提前感谢

代码语言:javascript
复制
    $timeoutSeconds = 20

$uninstall32    = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "My File" } | select UninstallString$uninstall64    = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-01 11:42:06

你没必要为了这件事而乱搞工作。以下是简单的方法:

代码语言:javascript
复制
start Notepad -PassThru | select -ExpandProperty id | set id
sleep 60
kill $id -ea 0

如果应用程序生成另一个应用程序并退出,这可能不起作用,因为Id将是错误的。在这种情况下,您可能需要在进程列表中或通过cmd行参数来搜索它。

票数 0
EN

Stack Overflow用户

发布于 2016-04-01 13:57:17

多亏了军士长,我成功地修改了代码,实现了我的目标。

唯一的问题是,很明显,无论进程是否仍在主动卸载,它都会在TOSecs值之后终止。

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

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

此过程检查32位和64位注册表条目中类似于ServiceName的MSI (Urbancode部署参数是在运行时传递给脚本的'${p:ServiceName}‘)

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

/x =卸载

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

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

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

希望这能帮到别人

代码语言:javascript
复制
$TOSecs      = 30
$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "'${p:ServiceName}'" } | select UninstallString
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | 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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36354981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档