@GitHub Copilot - Welcome @BanterBoy, I’m your Copilot and I’m here to help you get things done faster. I can identify issues, explain and even improve code.

You can ask generic questions, but what I’m really good at is helping you with your code. For example:

Generate unit tests for my code Explain the selected code Propose a fix for the bugs in my code If you want to learn more about my capabilities and limitations, check out the Copilot documentation.

I’m powered by AI, so surprises and mistakes are possible. Make sure to verify any generated code or suggestions, and share feedback so that we can learn and improve.

@BanterBoy: - Explain what the script does and why it is useful.

@GitHub Copilot - This PowerShell script is called Get-ServiceDetails.ps1 and it retrieves details about a Windows service. The script takes in a parameter called $ComputerName which is an array of computer names. It also takes in a parameter called $DisplayName which is the display name of the service to retrieve details for.

The script uses a foreach loop to iterate through each computer name in the $ComputerName array. For each computer, it uses the Get-CimInstance cmdlet to retrieve all instances of the Win32_Service class from the root/CIMV2 namespace. It then uses the Where-Object cmdlet to filter the results to only include services whose DisplayName property matches the $DisplayName parameter.

For each service instance that matches the filter, the script creates a hashtable called $properties that contains the properties of the service that it wants to retrieve. It then creates a new PSObject using the New-Object cmdlet and sets the properties of the object to the values in the $properties hashtable. Finally, it writes the object to the output stream using the Write-Output cmdlet.

The script also includes error handling using try-catch-finally blocks. If an error occurs while retrieving the service instances or creating the PSObject, the script writes an error message to the error stream using the Write-Error cmdlet.

Possible ways to improve the code with respect to readability and performance include:

  • Adding comments to explain the purpose of each section of the script
  • Using the -Filter parameter of the Get-CimInstance cmdlet instead of filtering the results with Where-Object
  • Using the -AsHashtable parameter of the Get-CimInstance cmdlet to retrieve the service properties as a hashtable instead of creating a new hashtable for each service instance

@BanterBoy: - Can you provide examples for using the script

@GitHub Copilot - Sure! Here are some examples of how you can use the Get-ServiceDetails.ps1 script:

  1. Retrieve details for a service named “Spooler” on a single computer:
.\Get-ServiceDetails.ps1 -ComputerName "COMPUTER01" -DisplayName "Spooler"
  1. Retrieve details for a service named “Spooler” on multiple computers:
.\Get-ServiceDetails.ps1 -ComputerName "COMPUTER01", "COMPUTER02", "COMPUTER03" -DisplayName "Spooler"
  1. Retrieve details for all services on a single computer:
.\Get-ServiceDetails.ps1 -ComputerName "COMPUTER01" -DisplayName "*"
  1. Retrieve details for all services on multiple computers:
.\Get-ServiceDetails.ps1 -ComputerName "COMPUTER01", "COMPUTER02", "COMPUTER03" -DisplayName "*"

Note that you can replace the computer names and service display name with your own values. Also, make sure to run the script from a PowerShell console and provide the correct path to the script file.


function Get-ServiceDetails {
    [CmdletBinding(DefaultParameterSetName = 'Default',
        PositionalBinding = $true,
        SupportsShouldProcess = $true)]
    [OutputType([string], ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Default',
            Mandatory = $false,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            HelpMessage = 'Enter a computer name or pipe input'
        [string[]]$ComputerName = $env:COMPUTERNAME,

        [Parameter(Mandatory = $false,
            ValueFromPipeline = $True,
            ValueFromPipelineByPropertyName = $True,
            HelpMessage = "Please enter the service DisplayName or Pipe in from another command.")]
        [string[]]$DisplayName = "*"

    BEGIN {


        if ($PSCmdlet.ShouldProcess("Target", "Operation")) {

            try {
                foreach ($Computer in $ComputerName) {
                    $instances = Get-CimInstance -Query "SELECT * FROM Win32_Service" -Namespace "root/CIMV2" -Computername $Computer -ErrorAction Continue | Where-Object { $_.DisplayName -like "$DisplayName" }
            catch {
                Write-Error  -Message $_

            foreach ( $item in $instances ) {
                try {
                    $properties = @{
                        AcceptPause             = $item.AcceptPause
                        AcceptStop              = $item.AcceptStop
                        Caption                 = $item.Caption
                        CheckPoint              = $item.CheckPoint
                        CreationClassName       = $item.CreationClassName
                        DelayedAutoStart        = $item.DelayedAutoStart
                        Description             = $item.Description
                        DesktopInteract         = $item.DesktopInteract
                        DisplayName             = $item.DisplayName
                        ErrorControl            = $item.ErrorControl
                        ExitCode                = $item.ExitCode
                        InstallDate             = $item.InstallDate
                        Name                    = $item.Name
                        PathName                = $item.PathName
                        ProcessId               = $item.ProcessId
                        ServiceSpecificExitCode = $item.ServiceSpecificExitCode
                        ServiceType             = $item.ServiceType
                        Started                 = $item.Started
                        StartMode               = $item.StartMode
                        StartName               = $item.StartName
                        State                   = $item.State
                        Status                  = $item.Status
                        SystemCreationClassName = $item.SystemCreationClassName
                        SystemName              = $item.SystemName
                        TagId                   = $item.TagId
                        WaitHint                = $item.WaitHint
                catch {
                    Write-Error  -Message $_
                finally {
                    $obj = New-Object -TypeName PSObject -Property $properties
                    Write-Output $obj

    END {


Back to Top


Please feel free to copy parts of the script or if you would like to download the entire script, simple click the download button. You can download the complete repository in a zip file by clicking the Download link in the menu bar on the left hand side of the page.

Report Issues

You can report an issue or contribute to this site on GitHub. Simply click the button below and add any relevant notes. I will attempt to respond to all issues as soon as possible.


Back to Top