我正在学习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
看起来与语法非常相似并不会发生这种情况?!
答案 0 :(得分:5)
您将管道输入提供给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
正如您所看到的,是两个cmdlet之间-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 *
参数:
void startMyActivity()
{
Intent myActivity= new Intent(mainActivity.this, newActivity.class);
startActivity(myActivity);
}
答案 1 :(得分:0)
cmdlet具有参数集(1个或更多)。
Get-Service有3个:默认, DisplayName 和 InputObject 。
不幸的是,您没有使用其中任何一个,这就解释了为什么PowerShell会抱怨某些内容。
您可以这样使用可用的参数集:
ServiceController
类型的对象,而不是你的情况。 1 |
select @{l='computername';e={$env:COMPUTERNAME}} |
gsv -DisplayName 'your-service's-display-name'
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 ),你不是。