বিদ্যমান অ্যাপ্লিকেশনটি আনইনস্টল করার জন্য পাওয়ারশেল ব্যবহার করে স্ট্যান্ডার্ড ' প্রোগ্রামগুলি যুক্ত করুন বা সরান ' কার্যকারিতাটি হুঙ্ক করার কি কোনও সহজ উপায় আছে ? বা অ্যাপ্লিকেশন ইনস্টল করা আছে কিনা তা পরীক্ষা করতে?
বিদ্যমান অ্যাপ্লিকেশনটি আনইনস্টল করার জন্য পাওয়ারশেল ব্যবহার করে স্ট্যান্ডার্ড ' প্রোগ্রামগুলি যুক্ত করুন বা সরান ' কার্যকারিতাটি হুঙ্ক করার কি কোনও সহজ উপায় আছে ? বা অ্যাপ্লিকেশন ইনস্টল করা আছে কিনা তা পরীক্ষা করতে?
উত্তর:
$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()
একটু কোড গল্ফ।
সম্পাদনা: কয়েক বছর ধরে এই উত্তরটি বেশ কয়েকটি উন্নতি করেছে। আমি কিছু মন্তব্য যোগ করতে চাই। আমি তখন থেকে পাওয়ারশেলটি ব্যবহার করি নি, তবে কিছু সমস্যা পর্যবেক্ষণ করার বিষয়টি আমার মনে আছে:
-First 1
তবে তবে আমি নিশ্চিত নই। সম্পাদনা করতে নির্দ্বিধায়।ডাব্লুএমআই অবজেক্ট ব্যবহার করা চিরকালের জন্য নেয়। আপনি যে প্রোগ্রামটি আনইনস্টল করতে চান কেবল তার নামটি জানলে এটি খুব দ্রুত।
$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_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"}
}
এই পোস্টে কিছুটা যুক্ত করার জন্য, আমার একাধিক সার্ভার থেকে সফ্টওয়্যার সরিয়ে ফেলতে সক্ষম হওয়া দরকার। আমি জেফের উত্তরটি আমাকে এটিতে পরিচালিত করতে ব্যবহার করেছি:
প্রথমে আমি সার্ভারের একটি তালিকা পেয়েছি, আমি একটি এডি ক্যোয়ারী ব্যবহার করেছি , তবে আপনি চাইলে কম্পিউটার নামের অ্যারে সরবরাহ করতে পারেন:
$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()
}
আমি নামের পরিবর্তে মিলে আইডেন্টিফাইনিং নম্বরটি ব্যবহার করেছি, কেবলমাত্র আমি সঠিক অ্যাপ্লিকেশনটি আনইনস্টল করছি তা নিশ্চিত হতে।
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()
}
আমি আশা করি এটি কার্যকর হবে।
নোট করুন যে আমি এই স্ক্রিপ্টটির উপর ভিত্তি করে এই স্ক্রিপ্টটির কৃতিত্ব আমার দায়বদ্ধ David
এখানে মিসিকেক্স ব্যবহার করে পাওয়ারশেল স্ক্রিপ্টটি দেওয়া হচ্ছে:
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 + "'")
}
}
ধরা যাক আপনি নোটপ্যাড ++ আনইনস্টল করতে চেয়েছিলেন । কেবল পাওয়ারশেলের মধ্যে এটি টাইপ করুন:
> 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 এর অধীনে চলেছিল।
আমি PS1 ফাইলটি এখানে দেখা হিসাবে চালিত করেছি। এডি থেকে সমস্ত সিস্টেম পুনরুদ্ধার করা এবং সমস্ত সিস্টেমে একাধিক অ্যাপ্লিকেশন আনইনস্টল করার চেষ্টা করা।
আমি ডেভিড স্টিলার্স ইনপুটটির সফ্টওয়্যার কারণ অনুসন্ধান করতে আইডেন্টিফাইং নাম্বার ব্যবহার করেছি।
পরীক্ষিত না:
এটি কি না:
আমি আনইনস্টল () ব্যবহার করতে সক্ষম হইনি। এমন চেষ্টা করেও যে আমাকে বলতে একটি ত্রুটি পেয়েছি যে নূন্যমূল্যের মূল্য রয়েছে এমন একটি অভিব্যক্তির জন্য কোনও পদ্ধতি কল করা সম্ভব নয়। পরিবর্তে আমি সরান-ডাব্লুএমআইওবজেক্টটি ব্যবহার করেছি, যা মনে হয় এটি সম্পূর্ণ হয়।
সতর্কতা : কোনও কম্পিউটারের নাম না দিয়ে এটি অ্যাক্টিভ ডিরেক্টরিতে সমস্ত সিস্টেম থেকে সফ্টওয়্যারটি সরিয়ে দেয় ।
আমার বেশিরভাগ প্রোগ্রামের জন্য এই পোস্টের স্ক্রিপ্টগুলি কাজ করেছিল। তবে আমাকে একটি লিগ্যাসি প্রোগ্রামের মুখোমুখি হতে হয়েছিল যা আমি 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 সাফল্য
উপরের কমান্ডগুলিও দূরবর্তীভাবে চলতে পারে - আমি এটি কমান্ড কমান্ড ব্যবহার করেই করেছি তবে আমি বিশ্বাস করি যে-যুক্তিটি যুক্ত করে কাজ করতে পারে