আমি কীভাবে পাওয়ারশেল ব্যবহার করে কোনও অ্যাপ্লিকেশন আনইনস্টল করতে পারি?


136

বিদ্যমান অ্যাপ্লিকেশনটি আনইনস্টল করার জন্য পাওয়ারশেল ব্যবহার করে স্ট্যান্ডার্ড ' প্রোগ্রামগুলি যুক্ত করুন বা সরান ' কার্যকারিতাটি হুঙ্ক করার কি কোনও সহজ উপায় আছে ? বা অ্যাপ্লিকেশন ইনস্টল করা আছে কিনা তা পরীক্ষা করতে?

উত্তর:


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

$app.Uninstall()

সম্পাদনা করুন: রব ফিল্টার প্যারামিটার দিয়ে এটি করার অন্য একটি উপায় খুঁজে পেয়েছিল:

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

1
এটি বেশ সুন্দর, আমি বলব যে কেবলমাত্র ক্ষেত্রে, নামের চেয়ে আইডেন্টিফাইং নাম্বার ব্যবহার করা ভাল।
টব

6
কিছুটা গবেষণার পরে আপনি গেট-ডাব্লুআইওবজেক্টের ফিল্টার ক্লজটিও ব্যবহার করতে পারেন: = অ্যাপ্লিকেশন = গেম-ডাব্লুআইওবজেক্ট-ক্লাস উইন 32 প্রডাক্ট-ফিল্টার "উইন32_প্রডাক্ট WHERE নাম = 'সফটওয়্যার নাম' থেকে" নির্বাচন করুন
রব

8
নোট করুন যে ডাব্লুএমআইয়ের দিকে তাকানো কেবলমাত্র এমএসআইয়ের মাধ্যমে ইনস্টল হওয়া পণ্যগুলির জন্য কাজ করবে।
EBGreen

7
এই ডাব্লুএমআই ক্লাসটি গণনায় আরও বেশি সময় নেয়। আমি জেফকে পরামর্শ দিচ্ছি যে আপনি রবের টিপ অন্তর্ভুক্ত করতে আপনার কোড আপডেট করুন।
halr9000

4
(gwmi Win32_Product | ? Name -eq "Software").uninstall() একটু কোড গল্ফ।
রাউন্ডার

51

সম্পাদনা: কয়েক বছর ধরে এই উত্তরটি বেশ কয়েকটি উন্নতি করেছে। আমি কিছু মন্তব্য যোগ করতে চাই। আমি তখন থেকে পাওয়ারশেলটি ব্যবহার করি নি, তবে কিছু সমস্যা পর্যবেক্ষণ করার বিষয়টি আমার মনে আছে:

  1. নীচের স্ক্রিপ্টের জন্য যদি আরও 1 টির বেশি মিল থাকে তবে এটি কাজ করে না এবং আপনার অবশ্যই পাওয়ারশেল ফিল্টার যুক্ত করতে হবে যা ফলাফলগুলিকে 1 টি সীমাবদ্ধ করে I আমি বিশ্বাস করি এটি -First 1তবে তবে আমি নিশ্চিত নই। সম্পাদনা করতে নির্দ্বিধায়।
  2. এমএসআই দ্বারা অ্যাপ্লিকেশন ইনস্টল না করা থাকলে এটি কার্যকর হয় না। এটি নীচে হিসাবে লেখার কারণ হ'ল এটি হস্তক্ষেপ ছাড়াই এমএসআইকে আনইনস্টল করার জন্য পরিবর্তন করে, যা দেশী আনইনস্টল স্ট্রিং ব্যবহার করার সময় সর্বদা ডিফল্ট কেস হয় না।

ডাব্লুএমআই অবজেক্ট ব্যবহার করা চিরকালের জন্য নেয়। আপনি যে প্রোগ্রামটি আনইনস্টল করতে চান কেবল তার নামটি জানলে এটি খুব দ্রুত।

$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
এর জন্য ধন্যবাদ! -like "appNam*"সংস্করণ নামে রয়েছে এবং এটি পরিবর্তন হয়েছে বলে আমি এটি ব্যবহার করার চেষ্টা করছি তবে এটি প্রোগ্রামটি খুঁজে পাবে না বলে মনে হচ্ছে। কোন ধারনা?
এনসোথ

1
পাওয়ারশেলের জন্য পছন্দসই ফাংশনটি সন্ধান করুন, কীভাবে ফিল্টারটি আপনার স্ট্রিংয়ের সাথে সঠিকভাবে মেলে তা তৈরি করতে কোনও ফিল্টার ব্যবহার করুন। পরীক্ষার জন্য কেবল শেলটি ব্যবহার করুন, এবং এটি একবার পেয়ে গেলে সঠিক
ম্যাচটি

2
এই সোনার। ব্যক্তিগতভাবে, আমি '/ কিবিবি' থেকে 'বি' মুছে ফেলছি যাতে আপনার কোনও ডায়ালগ দেখতে না পান।
হোয়াইট হটলভটাইগার

অনেক বেশি দ্রুত :-)
অস্কার ফোলে

3
আমি এটিকে প্রম্পট এবং একটি "আমি কী আনইনস্টল করতে চলেছি" দিয়ে একটি .ps1 স্ক্রিপ্টে পরিণত করেছি। gist.github.com/chrisfcarrol/e38b9ffcc52fa9d4eb9ab73b13915f5a
ক্রিস এফ ক্যারল

34

জেফ হিলম্যানের পোস্টে দ্বিতীয় পদ্ধতি ঠিক করার জন্য, আপনি হয় যা করতে পারেন:

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

অথবা

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

কেবলমাত্র একটি মাথা আপ ... আমি দেখতে পেলাম যে "-ফিলার" বিকল্পের পরিবর্তে "-কিউরি" ব্যবহার করে কোনও ডাব্লুএমইউবজেক্ট ফেরত আসেনি, সুতরাং এটিতে "আনইনস্টল" পদ্ধতিটি নেই।
ডগ জে Huras

7

আমি জানতে পেরেছি যে Win32_P উত্পাদক শ্রেণিটি সুপারিশ করা হয় না কারণ এটি মেরামত শুরু করে এবং কোয়েরিটি অনুকূলিতকরণ করা হয় না। উৎস

আপনি অ্যাপ্লিকেশন নির্দেশিকা জানেন কিনা তা আনইনস্টল করার জন্য স্ক্রিপ্ট সহ সিতারাম পামার্থীর এই পোস্টটি পেয়েছি । তিনি এখানে খুব দ্রুত অ্যাপ্লিকেশন অনুসন্ধান করতে অন্য স্ক্রিপ্ট সরবরাহ করেন ।

এটির মতো ব্যবহার করুন: \ আনইনস্টল করুন ps 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"}
 }

7

এই পোস্টে কিছুটা যুক্ত করার জন্য, আমার একাধিক সার্ভার থেকে সফ্টওয়্যার সরিয়ে ফেলতে সক্ষম হওয়া দরকার। আমি জেফের উত্তরটি আমাকে এটিতে পরিচালিত করতে ব্যবহার করেছি:

প্রথমে আমি সার্ভারের একটি তালিকা পেয়েছি, আমি একটি এডি ক্যোয়ারী ব্যবহার করেছি , তবে আপনি চাইলে কম্পিউটার নামের অ্যারে সরবরাহ করতে পারেন:

$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()
}

আমি নামের পরিবর্তে মিলে আইডেন্টিফাইনিং নম্বরটি ব্যবহার করেছি, কেবলমাত্র আমি সঠিক অ্যাপ্লিকেশনটি আনইনস্টল করছি তা নিশ্চিত হতে।


কেবল সুদৃশ্য এই সমাধান
রাফায়েউ

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


3

আমি আমার নিজের সামান্য অবদান রাখব। আমার একই কম্পিউটার থেকে প্যাকেজগুলির একটি তালিকা অপসারণ করা দরকার। এই স্ক্রিপ্টটি আমি নিয়ে এসেছি।

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

আমি আশা করি এটি কার্যকর হবে।

নোট করুন যে আমি এই স্ক্রিপ্টটির উপর ভিত্তি করে এই স্ক্রিপ্টটির কৃতিত্ব আমার দায়বদ্ধ David


2

এখানে মিসিকেক্স ব্যবহার করে পাওয়ারশেল স্ক্রিপ্টটি দেওয়া হচ্ছে:

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"

আমি এই পতাকাটি নীচের পতাকাগুলির সাথে সংযুক্ত করেছি , কিছু কারণে এটি আমার জন্য অন্যান্য পদ্ধতির চেয়ে ভাল কাজ করে।
ডেভিড রজার্স 19

1

জেফ হিলম্যানের উত্তরের ভিত্তিতে:

এখানে একটি ফাংশন রয়েছে যা আপনি কেবলমাত্র আপনার যোগ করতে profile.ps1বা বর্তমান পাওয়ারশেল সেশনে সংজ্ঞা দিতে পারেন:

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

ধরা যাক আপনি নোটপ্যাড ++ আনইনস্টল করতে চেয়েছিলেন । কেবল পাওয়ারশেলের মধ্যে এটি টাইপ করুন:

> uninstall("notepad++")

Get-WmiObjectকিছুটা সময় নিতে পারে এমন সচেতন থাকুন , তাই ধৈর্য ধরুন!


0

ব্যবহার করুন:

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

এটি পুরোপুরি পরীক্ষিত নয়, তবে এটি পাওয়ারশেল 4 এর অধীনে চলেছিল।

আমি PS1 ফাইলটি এখানে দেখা হিসাবে চালিত করেছি। এডি থেকে সমস্ত সিস্টেম পুনরুদ্ধার করা এবং সমস্ত সিস্টেমে একাধিক অ্যাপ্লিকেশন আনইনস্টল করার চেষ্টা করা।

আমি ডেভিড স্টিলার্স ইনপুটটির সফ্টওয়্যার কারণ অনুসন্ধান করতে আইডেন্টিফাইং নাম্বার ব্যবহার করেছি।

পরীক্ষিত না:

  1. স্ক্রিপ্টে ফাংশনের কলগুলিতে আইডি যোগ না করে পরিবর্তে প্যারামিটার আইডি দিয়ে স্ক্রিপ্ট শুরু করুন
  2. আরো তারপর 1 কম্পিউটারের নাম সহ স্ক্রিপ্টের কলিং না স্বয়ংক্রিয়ভাবে ফাংশন থেকে উদ্ধার
  3. পাইপ থেকে তথ্য পুনরুদ্ধার করা হচ্ছে
  4. সিস্টেমের সাথে সংযোগ করতে আইপি ঠিকানা ব্যবহার করা

এটি কি না:

  1. সফ্টওয়্যারটি যদি কোনও প্রদত্ত সিস্টেমে আসলে পাওয়া যায় তবে এটি কোনও তথ্য দেয় না।
  2. এটি বিলম্বকরণের ব্যর্থতা বা সাফল্য সম্পর্কে কোনও তথ্য দেয় না।

আমি আনইনস্টল () ব্যবহার করতে সক্ষম হইনি। এমন চেষ্টা করেও যে আমাকে বলতে একটি ত্রুটি পেয়েছি যে নূন্যমূল্যের মূল্য রয়েছে এমন একটি অভিব্যক্তির জন্য কোনও পদ্ধতি কল করা সম্ভব নয়। পরিবর্তে আমি সরান-ডাব্লুএমআইওবজেক্টটি ব্যবহার করেছি, যা মনে হয় এটি সম্পূর্ণ হয়।

সতর্কতা : কোনও কম্পিউটারের নাম না দিয়ে এটি অ্যাক্টিভ ডিরেক্টরিতে সমস্ত সিস্টেম থেকে সফ্টওয়্যারটি সরিয়ে দেয় ।


0

আমার বেশিরভাগ প্রোগ্রামের জন্য এই পোস্টের স্ক্রিপ্টগুলি কাজ করেছিল। তবে আমাকে একটি লিগ্যাসি প্রোগ্রামের মুখোমুখি হতে হয়েছিল যা আমি msiexec.exe বা Win32_Prctct ক্লাস ব্যবহার করে সরাতে পারিনি। (কোনও কারণে আমি 0 থেকে প্রস্থান পেয়েছি তবে প্রোগ্রামটি এখনও সেখানে ছিল)

আমার সমাধানটি ছিল উইন 32_প্রসেস ক্লাস ব্যবহার করা:

সহায়তায় nickdnk এই কমান্ড আনইনস্টল 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

আপনাকে ফলাফলের স্ট্রিংটি পরিষ্কার করতে হবে:

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

এখন যখন আপনার প্রাসঙ্গিক প্রোগ্রামটি এক্স ফাইল ফাইলটি আনইনস্টল করুন আপনি এই আদেশটি ব্যবহার করতে পারেন:

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

$ আনইনস্টলResult - এর প্রস্থান কোড থাকবে। 0 সাফল্য

উপরের কমান্ডগুলিও দূরবর্তীভাবে চলতে পারে - আমি এটি কমান্ড কমান্ড ব্যবহার করেই করেছি তবে আমি বিশ্বাস করি যে-যুক্তিটি যুক্ত করে কাজ করতে পারে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.