क्या मौजूदा एप्लिकेशन को अनइंस्टॉल करने के लिए PowerShell का उपयोग करके प्रोग्राम की कार्यक्षमता को मानक में हुक करने का एक सरल तरीका है ? या यह जांचने के लिए कि क्या एप्लिकेशन इंस्टॉल है?
क्या मौजूदा एप्लिकेशन को अनइंस्टॉल करने के लिए 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'"
(gwmi Win32_Product | ? Name -eq "Software").uninstall()
थोड़ा कोड गोल्फ।
EDIT: पिछले कुछ वर्षों में इस उत्तर में काफी वृद्धि हुई है। मैं कुछ टिप्पणियां जोड़ना चाहूंगा। मैंने तब से PowerShell का उपयोग नहीं किया है, लेकिन मुझे याद है कि मैं कुछ मुद्दों का अवलोकन कर रहा हूं:
-First 1
लेकिन मुझे यकीन नहीं है। बेझिझक संपादित करें।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}
-like "appNam*"
क्योंकि संस्करण नाम में है और यह बदलता है, लेकिन यह प्रोग्राम को खोजने के लिए प्रतीत नहीं होता है। कोई विचार?
जेफ हिलमैन की पोस्ट में दूसरी विधि को ठीक करने के लिए, आप या तो एक कर सकते हैं:
$app = Get-WmiObject
-Query "SELECT * FROM Win32_Product WHERE Name = 'Software Name'"
या
$app = Get-WmiObject -Class Win32_Product `
-Filter "Name = 'Software Name'"
मुझे पता चला कि Win32_Product वर्ग अनुशंसित नहीं है क्योंकि यह मरम्मत को ट्रिगर करता है और क्वेरी अनुकूलित नहीं है। स्रोत
मुझे सीताराम परमार्थी की यह पोस्ट स्क्रिप्ट के साथ अनइंस्टॉल करने के लिए मिली, यदि आप ऐप गाइड जानते हैं। वह यहां वास्तव में तेजी से ऐप्स खोजने के लिए एक और स्क्रिप्ट की आपूर्ति भी करता है ।
इस तरह का उपयोग करें:। \ 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"}
}
इस पोस्ट में थोड़ा सा जोड़ने के लिए, मुझे कई सर्वर से सॉफ़्टवेयर निकालने में सक्षम होना चाहिए। मैंने जेफ के जवाब का इस्तेमाल करते हुए मुझे इस तक पहुंचा दिया:
पहले मुझे सर्वरों की एक सूची मिली, मैंने एक AD क्वेरी का उपयोग किया , लेकिन आप कंप्यूटर नामों की सरणी प्रदान कर सकते हैं, जो आप चाहते हैं:
$computers = @("computer1", "computer2", "computer3")
तब मैंने उनके माध्यम से लूप किया था, जो कि gwmi क्वेरी में -computer पैरामीटर जोड़ रहा था:
foreach($server in $computers){
$app = Get-WmiObject -Class Win32_Product -computer $server | Where-Object {
$_.IdentifyingNumber -match "5A5F312145AE-0252130-432C34-9D89-1"
}
$app.Uninstall()
}
मैंने नाम के बजाय मिलान करने के लिए IdentifyNumber संपत्ति का उपयोग किया, बस यह सुनिश्चित करने के लिए कि मैं सही एप्लिकेशन की स्थापना रद्द कर रहा हूं।
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"
कोड की एक पंक्ति:
get-package *notepad* |% { & $_.Meta.Attributes["UninstallString"]}
मैं अपना छोटा योगदान दूंगा। मुझे उसी कंप्यूटर से संकुल की सूची निकालने की आवश्यकता थी। यह वह स्क्रिप्ट है जिसके साथ मैं आया था।
$packages = @("package1", "package2", "package3")
foreach($package in $packages){
$app = Get-WmiObject -Class Win32_Product | Where-Object {
$_.Name -match "$package"
}
$app.Uninstall()
}
मुझे उम्मीद है कि यह उपयोगी साबित होगा।
ध्यान दें कि मैं डेविड स्टीटलर को इस स्क्रिप्ट का श्रेय देता हूं क्योंकि यह उसके आधार पर है।
यहाँ msiexec का उपयोग कर PowerShell स्क्रिप्ट दी गई है:
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"
जेफ हिलमैन के जवाब पर आधारित:
यहां एक ऐसा कार्य है जिसे आप केवल 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 + "'")
}
}
मान लीजिए कि आप नोटपैड ++ की स्थापना रद्द करना चाहते हैं । इसे 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}"
यह पूरी तरह से परीक्षण नहीं है, लेकिन यह पावरशेल 4 के तहत चला।
मैंने पीएस 1 फाइल को चलाया है क्योंकि यह यहाँ देखा गया है। इसे एडी से सभी सिस्टम को पुनः प्राप्त करते हैं और सभी सिस्टम पर कई एप्लिकेशन को अनइंस्टॉल करने की कोशिश करें।
मैंने डेविड स्टीटलर्स इनपुट के सॉफ़्टवेयर कारण की खोज करने के लिए IdentificationNumber का उपयोग किया है।
टेस्ट नहीं हुआ:
यह क्या नहीं है:
मैं स्थापना रद्द () का उपयोग करने में सक्षम नहीं था। यह कोशिश करना कि मुझे यह बताने में त्रुटि हुई कि NULL का मान रखने वाली अभिव्यक्ति के लिए एक विधि को कॉल करना संभव नहीं है। इसके बजाय मैंने Remove-WmiObject का उपयोग किया, जो समान को पूरा करता प्रतीत होता है।
चेतावनी : कंप्यूटर नाम दिए बिना यह सक्रिय निर्देशिका में सभी सिस्टम से सॉफ्टवेयर को हटा देता है ।
मेरे अधिकांश कार्यक्रमों के लिए इस पोस्ट की स्क्रिप्ट्स ने काम किया। लेकिन मुझे एक विरासत कार्यक्रम का सामना करना पड़ा जिसे मैं msiexec.exe या Win32_Product वर्ग का उपयोग करके नहीं निकाल सका। (किसी कारण से मैं 0 से बाहर हो गया लेकिन कार्यक्रम अभी भी था)
मेरा समाधान Win32_Process वर्ग का उपयोग करना था:
nickdnk की मदद से यह कमांड अनइंस्टॉल exe फ़ाइल पथ प्राप्त करने के लिए है:
64 बिट:
[array]$unInstallPathReg= gci "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | foreach { gp $_.PSPath } | ? { $_ -match $programName } | select UninstallString
32 बिट:
[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 सफलता है
उपरोक्त आदेश दूरस्थ रूप से भी चल सकते हैं - मैंने यह इनवोक कमांड का उपयोग करके किया था लेकिन मेरा मानना है कि तर्क जोड़ना