উইন্ডোজ পরিষেবা বিদ্যমান কিনা এবং পাওয়ারশেলের মধ্যে মুছুন কিনা তা পরীক্ষা করে দেখুন


148

আমি বর্তমানে একটি ডিপ্লোয়মেন্ট স্ক্রিপ্ট লিখছি যা বেশ কয়েকটি উইন্ডোজ পরিষেবা ইনস্টল করে।

পরিষেবার নামগুলি সংস্করণযুক্ত, সুতরাং আমি নতুন পরিষেবার ইনস্টলগুলির অংশ হিসাবে পূর্ববর্তী উইন্ডোজ পরিষেবা সংস্করণটি মুছতে চাই।

আমি কীভাবে পাওয়ারশেলের মধ্যে এটি সর্বোত্তমভাবে করতে পারি?

উত্তর:


235

Remove-Serviceপাওয়ারসেল .0.০ অবধি কোনও সেমিডলেট না থাকায় আপনি এর জন্য ডাব্লুএমআই বা অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন ( সরান-পরিষেবা ডক দেখুন)

উদাহরণ স্বরূপ:

$service = Get-WmiObject -Class Win32_Service -Filter "Name='servicename'"
$service.delete()

বা sc.exeসরঞ্জাম সহ:

sc.exe delete ServiceName

শেষ অবধি, যদি আপনার পাওয়ারশেল 6.0 এ অ্যাক্সেস থাকে:

Remove-Service -Name ServiceName

2
আপনি এই উদাহরণের প্রাসঙ্গিক অংশটি পাওয়ারশেলের কাছেও ট্রান্সপোর্টেড ইন্সটলার ক্লাসটি ব্যবহার করতে পারেন: এগহেডকাএফ.আর্টিকেলস / ২০০60০১০০৪.এএসপি তবে রাভিকান্তের পদ্ধতি সম্ভবত সহজ।
জনএল

7
পিএস এর আরও সাম্প্রতিক সংস্করণগুলিতে রিমুভ-ডাব্লুআইওবজেক্ট রয়েছে এবং silent সার্ভিস.ডিলেট () এর জন্য নীরব ব্যর্থতা থেকে সাবধান থাকুন - ফর্ম্যাটযুক্ত উদাহরণগুলির সাথে আরও একটি উত্তর যুক্ত করেছে।
স্ট্রফ

1
সংক্ষেপে, বেশিরভাগ আপ টু ডেট সংস্করণটি প্রশাসক হিসাবে $service = Get-WmiObject -Class Win32_Service -Filter "Name='servicename'" $service | Remove-WmiObject
পাওয়ারশেল

প্রত্যেকের তথ্যের জন্য, স্ট্রফের উত্তর বলে "নীরব ব্যর্থতা থেকে সাবধান থাকুন $service.delete()"
sirank

উইন্ডোজ পাওয়ারশেল 3.0.০-এ শুরু করে, সেন্টিমলেট গেট-ডাব্লুআইওবজেক্টটি গেট-সিমইন্সট্যান্স দ্বারা ছাড়িয়ে গেছে। আজকাল আপনি এটি করতে পারেন:Stop-Service 'servicename'; Get-CimInstance -ClassName Win32_Service -Filter "Name='servicename'" | Remove-CimInstance
রোজবার্গ লিনহারেস

122

কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করার কোনও ক্ষতি নেই, আমি দৌড়াচ্ছি (পাওয়ারশেল থেকে)

sc.exe \\server delete "MyService" 

অনেক নির্ভরযোগ্যতা না এমন সবচেয়ে নির্ভরযোগ্য পদ্ধতি।


55
.Exe অংশটি অত্যন্ত গুরুত্বপূর্ণ কারণ এটি নিজেই স্কে সেট-সামগ্রীর জন্য একটি উপনাম।
টম রবিনসন

@tjrobinson এর জন্য ধন্যবাদ, আমি .exeআপনার মন্তব্য না পাওয়া পর্যন্ত বাদ দিয়েছিলাম । এখন এটি আমার পক্ষে কাজ করছে।
gwin003

এটি কেবল তখনই কার্যকর যখন আপনার কাছে দূরবর্তী কম্পিউটারের অধিকার রয়েছে। যদি না হয় (সর্বাধিক সুরক্ষিত পরিবেশের মতো) এটি কাজ করবে না এবং আপনার এমন কিছু দরকার যা শংসাপত্রগুলি পাস করার পক্ষে সমর্থন করে
ডেভস্টেফেন্স

\\serverসার্ভিস স্থানীয় হলে সার্ভারের নাম ( ) সহজেই বাদ দেওয়া হয়।
jpmc26

1
এটি আরও ভাল কারণ এটি আরও সহজে স্ক্রিপ্টযোগ্য %এবং$_
চেইম এলিয়াহ


21

আমি "-ErrorAction SilentlyContinue" সমাধানটি ব্যবহার করেছি তবে পরে এটি সেই সমস্যাটিতে চলে গেল যা এটির পিছনে একটি ত্রুটি-রেকর্ড ছেড়ে যায়। সুতরাং "গেট-পরিষেবা" ব্যবহার করে পরিষেবাটি বিদ্যমান কিনা তা খতিয়ে দেখার আরও একটি সমাধান এখানে।

# Determines if a Service exists with a name as defined in $ServiceName.
# Returns a boolean $True or $False.
Function ServiceExists([string] $ServiceName) {
    [bool] $Return = $False
    # If you use just "Get-Service $ServiceName", it will return an error if 
    # the service didn't exist.  Trick Get-Service to return an array of 
    # Services, but only if the name exactly matches the $ServiceName.  
    # This way you can test if the array is emply.
    if ( Get-Service "$ServiceName*" -Include $ServiceName ) {
        $Return = $True
    }
    Return $Return
}

[bool] $thisServiceExists = ServiceExists "A Service Name"
$thisServiceExists 

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

Function ServiceExists([string] $ServiceName) {
    [bool] $Return = $False
    if ( Get-WmiObject -Class Win32_Service -Filter "Name='$ServiceName'" ) {
        $Return = $True
    }
    Return $Return
}

সুতরাং আরও একটি সম্পূর্ণ সমাধান প্রস্তাব:

# Deletes a Service with a name as defined in $ServiceName.
# Returns a boolean $True or $False.  $True if the Service didn't exist or was 
# successfully deleted after execution.
Function DeleteService([string] $ServiceName) {
    [bool] $Return = $False
    $Service = Get-WmiObject -Class Win32_Service -Filter "Name='$ServiceName'" 
    if ( $Service ) {
        $Service.Delete()
        if ( -Not ( ServiceExists $ServiceName ) ) {
            $Return = $True
        }
    } else {
        $Return = $True
    }
    Return $Return
}

7
আমি সম্পূর্ণতার জন্য Get-WmiObject -Class Win32_Service -Filter "Name='$serviceName'"এবং Get-Service $serviceName -ErrorAction Ignore(যা পরিষেবাটি উপস্থিত না থাকলে ত্রুটিটি সম্পূর্ণভাবে আড়াল করে) এর মধ্যে গতির তুলনা করার সিদ্ধান্ত নিয়েছি । আমি আশা করেছি গেট-ডাব্লুআইএমইউবজেক্টটি দ্রুত হতে পারে কারণ এটি কোনও ত্রুটি ফেলে না। আমি খুব ভুল ছিল। প্রতিটি লুপে 100 বার চালানো, গেট-পরিষেবাটি 0.16 সেকেন্ড সময় নিয়েছে, যদিও গেট-ডাব্লুআইএমবজেক্ট 9.66 সেকেন্ড সময় নিয়েছিল। সুতরাং গেট-পরিষেবাটি গেট-ডাব্লুআইএমবজেক্টের চেয়ে 60 গুণ দ্রুত।
সাইমন তেউসি

13

পিএস এর আরও সাম্প্রতিক সংস্করণগুলিতে সরান-ডাব্লুআইওবজেক্ট রয়েছে। $ Service.delete () এর জন্য নীরব ব্যর্থতা থেকে সাবধান থাকুন ...

PS D:\> $s3=Get-WmiObject -Class Win32_Service -Filter "Name='TSATSvrSvc03'"

PS D:\> $s3.delete()
...
ReturnValue      : 2
...
PS D:\> $?
True
PS D:\> $LASTEXITCODE
0
PS D:\> $result=$s3.delete()

PS D:\> $result.ReturnValue
2

PS D:\> Remove-WmiObject -InputObject $s3
Remove-WmiObject : Access denied 
At line:1 char:1
+ Remove-WmiObject -InputObject $s3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Remove-WmiObject], ManagementException
    + FullyQualifiedErrorId : RemoveWMIManagementException,Microsoft.PowerShell.Commands.RemoveWmiObject

PS D:\> 

আমার পরিস্থিতির জন্য আমাকে 'প্রশাসক হিসাবে' চালানো দরকার


7

পাওয়ার সংস্করণ 5.0 এ একাধিক পরিষেবা মুছতে, যেহেতু সরান পরিষেবাটি এই সংস্করণে বিদ্যমান নেই

নীচের কমান্ড চালান

Get-Service -Displayname "*ServiceName*" | ForEach-object{ cmd /c  sc delete $_.Name}

5

দিমিত্রি ও ডিসিএক্স এর উত্তরগুলির সংমিশ্রণটি আমি এটি করেছি:

function Confirm-WindowsServiceExists($name)
{   
    if (Get-Service $name -ErrorAction SilentlyContinue)
    {
        return $true
    }
    return $false
}

function Remove-WindowsServiceIfItExists($name)
{   
    $exists = Confirm-WindowsServiceExists $name
    if ($exists)
    {    
        sc.exe \\server delete $name
    }       
}

4

কেউ যেখানে-অবজেক্ট ব্যবহার করতে পারে

if ((Get-Service | Where-Object {$_.Name -eq $serviceName}).length -eq 1) { "Service Exists" }


3

নামের একটি উইন্ডোজ পরিষেবা MySuperServiceVersion1উপস্থিত রয়েছে কিনা তা যাচাই করতে আপনি তার সঠিক নামটি সম্পর্কে নিশ্চিত নাও হতে পারেন, আপনি ওয়াইল্ডকার্ড ব্যবহার করতে পারেন, এই জাতীয় একটি স্ট্রিং ব্যবহার করে:

 if (Get-Service -Name "*SuperService*" -ErrorAction SilentlyContinue)
{
    # do something
}

3

একক পিসির জন্য:

if (Get-Service "service_name" -ErrorAction 'SilentlyContinue'){(Get-WmiObject -Class Win32_Service -filter "Name='service_name'").delete()}

else{write-host "No service found."}

পিসি তালিকার জন্য ম্যাক্রো:

$name = "service_name"

$list = get-content list.txt

foreach ($server in $list) {

if (Get-Service "service_name" -computername $server -ErrorAction 'SilentlyContinue'){
(Get-WmiObject -Class Win32_Service -filter "Name='service_name'" -ComputerName $server).delete()}

else{write-host "No service $name found on $server."}

}

3

পাওয়ারশেল কোর ( v6 + ) এখন একটি Remove-Serviceসেমিডলেট আছে

আমি এটি উইন্ডোজ পাওয়ারশেলের ব্যাক-পোর্ট করার পরিকল্পনা সম্পর্কে জানি না , যেখানে এটি v5.1-তে উপলব্ধ নয়

উদাহরণ:

# PowerShell *Core* only (v6+)
Remove-Service someservice

নোট করুন যে পরিষেবাটি উপস্থিত না থাকলে অনুরোধ ব্যর্থ হয়, সুতরাং এটি বর্তমানে উপস্থিত থাকলে কেবল তা সরাতে আপনি করতে পারেন:

# PowerShell *Core* only (v6+)
$name = 'someservice'
if (Get-Service $name -ErrorAction Ignore) {
  Remove-Service $name
}

3
  • ভি 6 এর আগে পাওয়ারশেল সংস্করণগুলির জন্য, আপনি এটি করতে পারেন:

    Stop-Service 'YourServiceName'; Get-CimInstance -ClassName Win32_Service -Filter "Name='YourServiceName'" | Remove-CimInstance
  • ভি 6 + এর জন্য, আপনি সরান-পরিষেবা সেমিডলেট ব্যবহার করতে পারেন ।

দেখুন যে উইন্ডোজ পাওয়ারশেল ৩.০-এ শুরু হয়ে, সেমিডলেট গেট-ডাব্লুআইওবজেক্টটি গেট-সিমইন্সট্যান্স দ্বারা ছাড়িয়ে গেছে।


2

সার্ভারগুলির একটি ইনপুট তালিকা নিতে এটিকে অভিযোজিত, একটি হোস্টনাম নির্দিষ্ট করুন এবং কিছু সহায়ক আউটপুট দিন

            $name = "<ServiceName>"
            $servers = Get-content servers.txt

            function Confirm-WindowsServiceExists($name)
            {   
                if (Get-Service -Name $name -Computername $server -ErrorAction Continue)
                {
                    Write-Host "$name Exists on $server"
                    return $true
                }
                    Write-Host "$name does not exist on $server"
                    return $false
            }

            function Remove-WindowsServiceIfItExists($name)
            {   
                $exists = Confirm-WindowsServiceExists $name
                if ($exists)
                {    
                    Write-host "Removing Service $name from $server"
                    sc.exe \\$server delete $name
                }       
            }

            ForEach ($server in $servers) {Remove-WindowsServiceIfItExists($name)}

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