سؤال

هناك طريقة بسيطة هوك في معيار 'إضافة أو إزالة البرامج وظائف باستخدام PowerShell إلى إلغاء تثبيت تطبيق موجود?أو للتحقق مما إذا تم تثبيت التطبيق?

هل كانت مفيدة؟

المحلول

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

$app.Uninstall()

تحرير: روب وجدت طريقة أخرى للقيام بذلك مع فلتر المعلمة:

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

نصائح أخرى

تحرير:على مر السنين هذه الإجابة قد حصلت على عدد غير قليل القطرية.أود أن أضيف بعض التعليقات.أنا لم تستخدم PowerShell منذ لكني أتذكر مراعاة بعض المسائل:

  1. إذا كان هناك المزيد من المباريات من 1 أدناه النصي, أنها لا تعمل كما يجب إلحاق PowerShell تصفية حدود النتائج إلى 1.أعتقد أنه -First 1 ولكن لست متأكدا.لا تتردد في تعديلها.
  2. إذا كان التطبيق ليس مثبتا من قبل 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}

لإصلاح الأسلوب الثاني في جيف هيلمان بعد ، يمكنك إما القيام:

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

أو

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

لإضافة القليل إلى هذا المنصب, أنا في حاجة إلى أن تكون قادرة على إزالة البرامج من خوادم متعددة.اعتدت جيف الجواب أن يؤدي بي إلى هذا:

أولا لدي قائمة من خوادم اعتدت الإعلان الاستعلام, ولكن يمكنك تقديم مجموعة من أسماء أجهزة الكمبيوتر ولكن تريد:

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

ثم يحلق من خلالها ، إضافة الكمبيوتر المعلمة إلى 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 فئة لا ينصح لأنه يؤدي الإصلاحات وليس الاستعلام الأمثل. المصدر

وجدت هذا المنصب من Sitaram Pamarthi مع البرنامج النصي تثبيت إذا كنت تعرف التطبيق guid.كما لوازم أخرى النصي في البحث عن تطبيقات سريع حقا هنا.

استخدام مثل هذا:.\إلغاء التثبيت.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"}
 }
function Uninstall-App {
    Write-Output "Uninstalling $($args[0])"
    foreach($obj in Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall") {
        $dname = $obj.GetValue("DisplayName")
        if ($dname -contains $args[0]) {
            $uninstString = $obj.GetValue("UninstallString")
            foreach ($line in $uninstString) {
                $found = $line -match '(\{.+\}).*'
                If ($found) {
                    $appid = $matches[1]
                    Write-Output $appid
                    start-process "msiexec.exe" -arg "/X $appid /qb" -Wait
                }
            }
        }
    }
}

اتصل على هذا النحو:

Uninstall-App "Autodesk Revit DB Link 2019"

أنا سوف تجعل مساهمة خاصة.أنا في حاجة إلى إزالة قائمة من مجموعات من نفس الكمبيوتر.هذا هو النص الذى جاء مع.

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

آمل أن يكون هذا يبرهن على أن تكون مفيدة.

علما بأنني مدين ديفيد Stetler الفضل في هذا السيناريو لأنه يستند إلى بلده.

هنا هو البرنامج النصي PowerShell باستخدام 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"

سطر واحد من التعليمات البرمجية:

get-package *notepad* |% { & $_.Meta.Attributes["UninstallString"]}

بناء على جيف هيلمان الجواب:

وهنا وظيفة يمكنك فقط إضافة إلى 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 يمكن أن يستغرق بعض الوقت ، حتى يكون المريض!

استخدام:

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}"

ليس اختبارها بشكل كامل ، لكنه ركض تحت PowerShell 4.

لقد تشغيل PS1 الملف كما هو موضح هنا.السماح لها استرداد جميع الأنظمة من الإعلان و محاولة إلغاء تثبيت تطبيقات متعددة على جميع الأنظمة.

لقد استعملت IdentifyingNumber للبحث عن البرنامج سبب ديفيد Stetlers الإدخال.

لم تختبر:

  1. لا إضافة معرفات إلى استدعاء الدالة في البرنامج النصي بدلا من ذلك بدأ السيناريو مع المعلمة معرفات
  2. استدعاء البرنامج النصي مع أكثر من 1 اسم الكمبيوتر لا تلقائيا استردادها من وظيفة
  3. استرجاع البيانات من الأنابيب
  4. باستخدام عناوين IP للاتصال النظام

ما لا:

  1. أنها لا تعطي أي معلومات إذا كان البرنامج فعلا تم العثور على أي نظام معين.
  2. أنها لا تعطي أي معلومات حول فشل أو نجاح التفكيك.

لم أكن قادرا على استخدام تثبيت().أحاول أن لدي خطأ تقول لي أن استدعاء أسلوب التعبير الذي يحتوي على قيمة فارغة غير ممكن.بدلا اعتدت إزالة-لكن الشعب الأذربيجاني الذي يبدو لتحقيق نفس.

الحذر:بدون اسم كمبيوتر معين فهو يزيل البرامج من كل نظم في "Active Directory".

بالنسبة لمعظم من البرامج النصية في هذا المنصب ولم المهمة.ولكن كان يجب أن تواجه إرثا البرنامج الذي لم أستطع إزالة باستخدام msiexec.exe أو Win32_Product الدرجة.(من بعض السبب في أنني حصلت على الخروج 0 ولكن البرنامج لا يزال هناك)

الحل هو استخدام Win32_Process الدرجة:

مع مساعدة من nickdnk هذا الأمر هو الحصول على تثبيت exe file path:

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

سيكون لديك لتنظيف نتيجة سلسلة:

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

الآن عندما يكون لديك ذات الصلة إلغاء تثبيت البرنامج exe مسار الملف يمكنك استخدام هذا الأمر:

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

$uninstallResult - سوف يكون الخروج على القانون.0 هو النجاح

أوامر أعلاه يمكن أيضا تشغيل عن بعد - لقد فعلت ذلك باستخدام استدعاء الأوامر ولكن أعتقد أن إضافة الحجة -اسم الكمبيوتر يمكن أن تعمل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top