2008-09-22 50 views

Trả lời

120
$app = Get-WmiObject -Class Win32_Product | Where-Object { 
    $_.Name -match "Software Name" 
} 

$app.Uninstall() 

Edit: Rob tìm thấy một cách khác để làm điều đó với các tham số lọc:

$app = Get-WmiObject -Class Win32_Product ` 
        -Filter "Name = 'Software Name'" 
+6

Sau một chút nghiên cứu bạn cũng có thể sử dụng mệnh đề -filter của Get-WmiObject: $ app = Get-WmiObject-class Win32_Product -filter "select * from Win32_Product WHERE name = 'Software Name'" –

+4

lớp WMI này mất FOREVER để liệt kê e. Tôi đề nghị Jeff rằng bạn cập nhật mã của bạn để bao gồm mẹo của Rob. – halr9000

+1

Tôi đồng ý với Jeff ... phiên bản của tôi dường như không hoạt động bây giờ .... –

32

Để khắc phục lên phương pháp thứ hai trong bài Jeff Hillman, bạn có thể hoặc là làm một:

$app = Get-WmiObject 
      -Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'" 

Hoặc

$app = Get-WmiObject -Class Win32_Product ` 
        -Filter "Name = 'Software Name'" 
+0

Chỉ cần thông báo ... Tôi thấy rằng việc sử dụng "-Query" thay vì tùy chọn "-Filter" không trả lại WmiObject, vì vậy nó không có phương pháp "gỡ cài đặt". –

6

Để thêm một chút vào bài đăng này, tôi cần thiết để có thể xóa phần mềm khỏi nhiều Máy chủ. Tôi đã sử dụng câu trả lời của Jeff để đưa tôi đến đây:

Trước tiên tôi có một danh sách các máy chủ, tôi đã sử dụng một truy vấn AD, nhưng bạn có thể cung cấp hàng loạt các tên máy tính tuy nhiên bạn muốn:

$computers = @("computer1", "computer2", "computer3") 

Sau đó, tôi looped qua chúng, thêm các tham số -computer với truy vấn gwmi:

foreach($server in $computers){ 
    $app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object { 
     $_.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1" 
    } 
    $app.Uninstall() 
} 

tôi đã sử dụng tài sản IdentifyingNumber để phù hợp với thay cho tên, chỉ để chắc chắn tôi đã gỡ bỏ cài đặt các ứng dụng chính xác.

+0

Đơn giản chỉ cần đáng yêu giải pháp này – Raffaeu

3

Tôi sẽ tự đóng góp một chút. Tôi cần phải xóa danh sách các gói khỏi cùng một máy tính. Đây là kịch bản tôi đã đưa ra.

$packages = @("package1", "package2", "package3") 
foreach($package in $packages){ 
    $app = Get-WmiObject -Class Win32_Product | Where-Object { 
    $_.Name -match "$package" 
    } 
    $app.Uninstall() 
} 

Tôi hy vọng điều này chứng minh là hữu ích.

Lưu ý rằng tôi nợ David Stetler khoản tín dụng cho tập lệnh này vì nó dựa trên của mình.

0

Sử dụng:

function remove-HSsoftware{ 
[cmdletbinding()] 
param(
[parameter(Mandatory=$true, 
ValuefromPipeline = $true, 
HelpMessage="IdentifyingNumber can be retrieved with `"get-wmiobject -class win32_product`"")] 
[ValidatePattern('{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}}')] 
[string[]]$ids, 
[parameter(Mandatory=$false, 
      ValuefromPipeline=$true, 
      ValueFromPipelineByPropertyName=$true, 
      HelpMessage="Computer name or IP adress to query via WMI")] 
[Alias('hostname,CN,computername')] 
[string[]]$computers 
) 
begin {} 
process{ 
    if($computers -eq $null){ 
    $computers = Get-ADComputer -Filter * | Select dnshostname |%{$_.dnshostname} 
    } 
    foreach($computer in $computers){ 
     foreach($id in $ids){ 
      write-host "Trying to uninstall sofware with ID ", "$id", "from computer ", "$computer" 
      $app = Get-WmiObject -class Win32_Product -Computername "$computer" -Filter "IdentifyingNumber = '$id'" 
      $app | Remove-WmiObject 

     } 
    } 
} 
end{}} 
remove-hssoftware -ids "{8C299CF3-E529-414E-AKD8-68C23BA4CBE8}","{5A9C53A5-FF48-497D-AB86-1F6418B569B9}","{62092246-CFA2-4452-BEDB-62AC4BCE6C26}" 

Nó không kiểm tra đầy đủ, nhưng nó chạy dưới PowerShell 4.

tôi đã chạy file PS1 như nó được nhìn thấy ở đây. Để nó lấy tất cả các Hệ thống từ AD và cố gắng gỡ cài đặt nhiều ứng dụng trên tất cả các hệ thống.

Tôi đã sử dụng IdentifyingNumber để tìm kiếm Nguyên nhân phần mềm của đầu vào của David Stetlers.

Không thử nghiệm:

  1. Không thêm id để cuộc gọi của hàm trong kịch bản, thay vì bắt đầu từ kịch bản với ID tham số
  2. Calling kịch bản với hơn sau đó 1 tên máy tính không tự động lấy ra từ hàm
  3. Lấy dữ liệu từ đường ống
  4. Sử dụng địa chỉ IP để kết nối với hệ thống

gì nó không:

  1. Nó không đưa ra bất cứ thông tin nếu phần mềm thực sự đã được tìm thấy trên bất kỳ hệ thống nhất định.
  2. Nó không cung cấp bất kỳ thông tin nào về lỗi hoặc thành công của quá trình gỡ cài đặt.

Tôi không thể sử dụng gỡ cài đặt(). Cố gắng mà tôi nhận được một lỗi nói với tôi rằng việc gọi một phương thức cho một biểu thức có giá trị NULL là không thể. Thay vào đó, tôi đã sử dụng Remove-WmiObject, có vẻ như hoàn thành tương tự.

THẬN TRỌNG: Nếu không có tên máy tính, nó sẽ xóa phần mềm khỏi TẤT CẢ hệ thống trong Active Directory.

4

Tôi phát hiện ra rằng lớp Win32_Product không được khuyến nghị vì nó kích hoạt sửa chữa và không phải là truy vấn được tối ưu hóa. Source

Tôi tìm thấy this post từ Sitaram Pamarthi với tập lệnh gỡ cài đặt nếu bạn biết hướng dẫn ứng dụng. Ông cũng cung cấp một kịch bản khác để tìm kiếm các ứng dụng thực sự nhanh chóng here.

Sử dụng như thế này:. \ 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"} 
} 
29

EDIT: Qua nhiều năm câu trả lời này đã nhận được khá nhiều upvotes. Tôi muốn thêm một số ý kiến. Tôi đã không sử dụng PowerShell từ đó, nhưng tôi nhớ đã quan sát một số vấn đề:

  1. Nếu có nhiều hơn 1 cho tập lệnh dưới đây, nó không hoạt động và bạn phải nối thêm bộ lọc PowerShell giới hạn kết quả. tin rằng đó là -First 1 nhưng tôi không chắc chắn. Vui lòng chỉnh sửa.
  2. Nếu ứng dụng không được MSI cài đặt, nó không hoạt động. Lý do nó được viết như dưới đây là bởi vì nó sửa đổi MSI để gỡ bỏ cài đặt mà không cần can thiệp, mà không phải luôn luôn là trường hợp mặc định khi sử dụng chuỗi gỡ cài đặt gốc.

Sử dụng đối tượng WMI sẽ mất vĩnh viễn. Điều này rất nhanh nếu bạn chỉ biết tên của chương trình bạn muốn gỡ cài đặt.

$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} 
+1

Cảm ơn vì điều này! Tôi đang cố gắng sử dụng điều này với '-like 'appNam *" 'kể từ khi phiên bản có trong tên và nó thay đổi, nhưng nó dường như không tìm thấy chương trình. Bất kỳ ý tưởng? – NSouth

+1

Tra cứu chức năng giống như cho powerhell, tìm hiểu bộ lọc nào sử dụng cách làm cho nó khớp với chuỗi của bạn một cách chính xác. Chỉ cần sử dụng vỏ để kiểm tra, và một khi bạn nhận được nó phải thay thế -match :) – nickdnk

+2

Đây là vàng. Cá nhân, tôi xóa 'b' khỏi '/ qb' để bạn không phải xem bất kỳ hộp thoại nào. – WhiteHotLoveTiger

1

Dựa trên câu trả lời Jeff Hillman của:

Dưới đây là một chức năng bạn chỉ có thể thêm vào profile.ps1 của bạn hoặc xác định trong phiên PowerShell hiện tại:

# 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 + "'") 
    } 
} 

Hãy nói rằng bạn muốn gỡ bỏ cài đặt Notepad++. Chỉ cần gõ này vào PowerShell:

> uninstall("notepad++")

Chỉ cần lưu ý rằng Get-WmiObject có thể mất một thời gian, vì vậy hãy kiên nhẫn!

0

Đối với hầu hết các chương trình của tôi, các tập lệnh trong Bài đăng này đã thực hiện công việc. Nhưng tôi đã phải đối mặt với một chương trình di sản mà tôi không thể loại bỏ bằng cách sử dụng lớp msiexec.exe hoặc Win32_Product. (Từ một số lý do tôi đã exit 0 nhưng chương trình vẫn còn đó)

Giải pháp của tôi là sử dụng Win32_Process lớp:

với sự giúp đỡ từ nickdnk lệnh này là để có được con đường gỡ bỏ cài đặt file exe:

64bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString 

32bit:

[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString 

bạn sẽ phải làm sạch chuỗi kết quả:

$uninstallPath = $unInstallPathReg[0].UninstallString 
$uninstallPath = $uninstallPath -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" 
$uninstallPath = $uninstallPath .Trim() 

bây giờ khi bạn có liên quan chương trình tập tin gỡ bỏ cài đặt exe đường bạn có thể sử dụng lệnh này:

$uninstallResult = (Get-WMIObject -List -Verbose | Where-Object {$_.Name -eq "Win32_Process"}).InvokeMethod("Create","$unInstallPath") 

$ uninstallResult - sẽ có mã thoát. 0 là thành công

các lệnh trên cũng có thể chạy từ xa - tôi đã làm nó bằng cách sử gọi lệnh nhưng tôi tin rằng việc thêm đối số -computername có thể làm việc

1

Dưới đây là kịch bản PowerShell bằng msiexec:

echo "Getting product code" 
$ProductCode = Get-WmiObject win32_product -Filter "Name='Name of my Software in Add Remove Program Window'" | Select-Object -Expand IdentifyingNumber 
echo "removing Product" 
# Out-Null argument is just for keeping the power shell command window waiting for msiexec command to finish else it moves to execute the next echo command 
& msiexec /x $ProductCode | Out-Null 
echo "uninstallation finished" 
Các vấn đề liên quan