PowerShellを使用して標準の「プログラムの追加と削除」機能に接続して既存のアプリケーションをアンインストールする簡単な方法はありますか?または、アプリケーションがインストールされているかどうかを確認するには?
12 に答える
$app = Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "Software Name"
}
$app.Uninstall()
編集: Rob は、Filter パラメーターを使用してそれを行う別の方法を見つけました。
$app = Get-WmiObject -Class Win32_Product `
-Filter "Name = 'Software Name'"
編集: 長年にわたり、この回答にはかなりの賛成票が寄せられてきました。いくつかのコメントを追加したいと思います。それ以来、PowerShell を使用していませんが、いくつかの問題を観察したことを覚えています。
- 以下のスクリプトに 1 つ以上の一致がある場合、それは機能せず、結果を 1 に制限する PowerShell フィルターを追加する必要があります
-First 1
。自由に編集してください。 - アプリケーションが MSI によってインストールされていない場合、アプリケーションは機能しません。以下のように記述された理由は、MSI が介入なしでアンインストールするように変更するためです。これは、ネイティブ アンインストール文字列を使用する場合のデフォルトのケースではありません。
WMI オブジェクトの使用には時間がかかります。アンインストールするプログラムの名前がわかっている場合、これは非常に高速です。
$uninstall32 = gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString
$uninstall64 = gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match "SOFTWARE NAME" } | select UninstallString
if ($uninstall64) {
$uninstall64 = $uninstall64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall64 = $uninstall64.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall64 /qb" -Wait}
if ($uninstall32) {
$uninstall32 = $uninstall32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X",""
$uninstall32 = $uninstall32.Trim()
Write "Uninstalling..."
start-process "msiexec.exe" -arg "/X $uninstall32 /qb" -Wait}
Jeff Hillman の投稿の 2 番目の方法を修正するには、次のいずれかを実行できます。
$app = Get-WmiObject
-Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'"
または
$app = Get-WmiObject -Class Win32_Product `
-Filter "Name = 'Software Name'"
この投稿に少し付け加えると、複数のサーバーからソフトウェアを削除できるようにする必要がありました。私はこれに私を導くためにジェフの答えを使用しました:
最初にサーバーのリストを取得し、ADクエリを使用しましたが、必要に応じてコンピューター名の配列を指定できます。
$computers = @("computer1", "computer2", "computer3")
次に、-computer パラメーターを gwmi クエリに追加して、それらをループ処理しました。
foreach($server in $computers){
$app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
$_.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1"
}
$app.Uninstall()
}
正しいアプリケーションをアンインストールしていることを確認するために、名前の代わりに IdentifyingNumber プロパティを使用して照合しました。
Win32_Product クラスは修復をトリガーし、クエリが最適化されていないため、推奨されないことがわかりました。ソース
アプリのGUIDがわかっている場合にアンインストールするスクリプトを含むSitaram Pamarthiからのこの投稿を見つけました。彼はまた、ここでアプリを非常に高速に検索する別のスクリプトも提供しています。
次のように使用します: .\uninstall.ps1 -GUID {C9E7751E-88ED-36CF-B610-71A1D262E906}
[cmdletbinding()]
param (
[parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$ComputerName = $env:computername,
[parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Mandatory=$true)]
[string]$AppGUID
)
try {
$returnval = ([WMICLASS]"\\$computerName\ROOT\CIMV2:win32_process").Create("msiexec `/x$AppGUID `/norestart `/qn")
} catch {
write-error "Failed to trigger the uninstallation. Review the error message"
$_
exit
}
switch ($($returnval.returnvalue)){
0 { "Uninstallation command triggered successfully" }
2 { "You don't have sufficient permissions to trigger the command on $Computer" }
3 { "You don't have sufficient permissions to trigger the command on $Computer" }
8 { "An unknown error has occurred" }
9 { "Path Not Found" }
9 { "Invalid Parameter"}
}
Jeff Hillman の回答に基づく:
profile.ps1
現在の PowerShell セッションで追加または定義できる関数を次に示します。
# Uninstall a Windows program
function uninstall($programName)
{
$app = Get-WmiObject -Class Win32_Product -Filter ("Name = '" + $programName + "'")
if($app -ne $null)
{
$app.Uninstall()
}
else {
echo ("Could not find program '" + $programName + "'")
}
}
Notepad++をアンインストールしたいとしましょう。これを PowerShell に入力するだけです。
> uninstall("notepad++")
Get-WmiObject
しばらく時間がかかる可能性があることに注意してください。