0

助けていただけませんか?MSI スクリプトを実行するには、Powershell スクリプトを作成する必要があります。

また、プロセスにタイムアウトを設定する必要があります (与えられた MSI がハングすることがあるため)。

Start-Job/Wait-Job プロセスを使用してこれを達成できることがわかりました

明らかに、以下のコードは現在、非常に厳しい状態にあります

前もって感謝します

    $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
4

2 に答える 2

0

majkinetor のおかげで、目標を達成するためにコードを十分に変更することができました。

唯一のことは、プロセスがまだアクティブにアンインストールされているかどうかにかかわらず、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:\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
}
于 2016-04-01T13:57:17.800 に答える
0

そのために仕事を台無しにする必要はありません。簡単な方法は次のとおりです。

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

ID が間違っているため、アプリが別のアプリを生成して終了する場合、これは機能しない可能性があります。その場合、おそらくプロセス リストまたはコマンド ライン パラメーターを使用してハントする必要があります。

于 2016-04-01T11:42:06.517 に答える