Привязка параметров 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), которым вы не являетесь.