Привязка параметров Get-Service не работает должным образом

Я изучаю PowerShell и у меня есть вопрос о привязке параметров. Это, наверное, простой вопрос, но я в растерянности.

Если я наберу:

get-adcomputer -filter 'name -eq "serverone"' |
  select @{name='computername';e={$_.name}} |
  get-process

это дает мне список процессов на "serverone" и работает нормально. Но если я наберу:

get-adcomputer -filter 'name -eq "serverone"' |
  select @{name='computername';e={$_.name}} |
  get-service

тогда я получаю следующую ошибку:

get-service : Cannot find any service with service name
'@{computername=SERVERONE}'. At line:1 char:93
+ ... e={$_.name}} | get-service
+                    ~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (@{computername=SERVERONE}:String) [Get-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand

Почему это? И то и другое Get-Process а также Get-Service принять имя компьютера, и файлы справки для этого параметра выглядят одинаково. Интересно, если я наберу тот же код, но добавить -Name bits к Get-Service Команда выше, он возвращается с подробностями обслуживания. Так выглядит Get-Service пытается связать объект с именем службы, но этого не происходит с Get-Process который выглядит очень похожим по синтаксису?!

2 ответа

Вы вводите вход конвейера в Get-Service без каких-либо других параметров, поэтому конвейерные объекты передаются первому параметру, принимающему их, который -Name, Поскольку объекты не имеют свойства Name они передаются целиком и отливаются в строки, поэтому они выглядят как @{computername=SERVERONE}, Get-Service затем ищет службу с таким именем, которая, конечно же, не работает, вызывая ошибку, которую вы наблюдали.

Определения параметров для Get-Service (соответствующие характеристики выделены курсивом):

PS C:\> Get-Help Get-Service -Parameter Name

-Name 
    Specifies the service names of services to be retrieved. Wildcards
    are permitted. By default, Get-Service gets all of the services on
    the computer.

    Required?                    false
    Position?                    1
    Default value                All services
    Accept pipeline input?       true (ByPropertyName, ByValue)
    Accept wildcard characters?  true

PS C:\> Get-Help Get-Service -Parameter ComputerName

-ComputerName 
    Gets the services running on the specified computers. The default
    is the local computer.

    Type the NetBIOS name, an IP address, or a fully qualified domain
    name of a remote computer. To specify the local computer, type the
    computer name, a dot (.), or "localhost".

    This parameter does not rely on Windows PowerShell remoting. You
    can use the ComputerName parameter of Get-Service even if your
    computer is not configured to run remote commands.

    Required?                    false
    Position?                    named
    Default value                Local computer
    Accept pipeline input?       true (ByPropertyName)
    Accept wildcard characters?  false

Определения параметров для Get-Process (соответствующие характеристики выделены курсивом):

PS C:\> Get-Help Get-Process -Parameter Name

-Name 
    Specifies one or more processes by process name. You can type
    multiple process names (separated by commas) and use wildcard
    characters. The parameter name ("Name") is optional.

    Required?                    false
    Position?                    1
    Default value
    Accept pipeline input?       true (ByPropertyName)
    Accept wildcard characters?  true

PS C:\> Get-Help Get-Process -Parameter ComputerName

-ComputerName 
    Gets the processes running on the specified computers. The default
    is the local computer.

    Type the NetBIOS name, an IP address, or a fully qualified domain
    name of one or more computers. To specify the local computer, type
    the computer name, a dot (.), or "localhost".

    This parameter does not rely on Windows PowerShell remoting. You
    can use the ComputerName parameter of Get-Process even if your
    computer is not configured to run remote commands.

    Required?                    false
    Position?                    named
    Default value                Local computer
    Accept pipeline input?       true (ByPropertyName)
    Accept wildcard characters?  false

Как вы можете видеть, есть разница в определении -Name параметр между двумя командлетами. Get-Service принимает входные данные конвейера -Name не только по имени свойства, но и по значению, в то время как Get-Process не. Поэтому Get-Process обрабатывает входные данные конвейера, как и предполагалось Get-Service не делает.

Чтобы избежать этой проблемы, вам нужно указать, какие услуги вы хотите получить. использование * для всех услуг. С -Name указанный параметр имена компьютеров передаются в -ComputerName параметр по имени свойства, как вы и предполагали:

Get-ADComputer -Filter 'Name -eq "serverone"' |
  select @{n='ComputerName';e={$_.Name}} |
  Get-Service -Name *

Командлет имеет наборы параметров (1 или более).

Get-Service имеет 3: Default, DisplayName и InputObject.

К сожалению, вы не используете ни один из них, что объясняет, почему PowerShell жалуется на что-то.

Вы можете использовать доступные наборы параметров следующим образом:

  • InputObject: требуется ServiceController Тип объекта, который не ваш случай.
  • DisplayName: для этого необходимо указать имя параметра, явно, как в:

1 |
select @{l='computername';e={$env:COMPUTERNAME}} |
gsv -DisplayName 'your-service's-display-name'

  • По умолчанию: это, вероятно, тот, который соответствует вашему коду. Этот набор параметров позволяет передавать параметр ComputerName либо как свойство объекта, либо как позиционный параметр. Например:

1- Как позиционный параметр:

1 |
select @{l='computername';e={$env:COMPUTERNAME}} |
gsv alg # 'alg' is the service name; you can choose some other(s)

2- В качестве параметра объекта:

1 |
select @{l='name';e={'alg'}},@{l='computername';e={$env:COMPUTERNAME}} |
gsv

Обратите внимание, что этот последний очень напоминает ваш код. Важным отличием является то, что я определяю имя свойства объекта (кроме ComputerName), которым вы не являетесь.

Другие вопросы по тегам