运行作业时的参数解释

$h = "host1.example.com" $code = { $(Get-WmiObject -Class "Win32_ComputerSystem" -Namespace "root\cimv2" -ComputerName $h) } $timeout = 5 $jobstate = $(Wait-Job -Job ($job = $(Start-Job -ScriptBlock $code)) -Timeout $timeout) $wmicomobj = $(Receive-Job -Job $job) 

为什么上面的代码块会引发下面的错误?

 无法validation参数“ComputerName”上的参数。 参数是null或
空。 提供一个非空或空的参数,然后尝试命令
再次。
     + CategoryInfo:InvalidData:(:) [Get-WmiObject],ParameterBindingValidationException
     + FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.PowerShell.Commands.GetWmiObjectCommand
     + PSComputerName:本地主机 

我想用这个实现一个循环中获取多个主机的WMI对象的超时。 但首先我需要通过作业执行得到结果。

脚本的全局范围中定义的variables在脚本块中不可用,除非使用using限定符:

 $code = { Get-WmiObject -Class "Win32_ComputerSystem" -Namespace "root\cimv2" -ComputerName $using:h } 

或者将它们作为parameter passing,如下所示:

 $code = { Param($hostname) Get-WmiObject -Class "Win32_ComputerSystem" -Namespace "root\cimv2" -ComputerName $hostname } $jobstate = Wait-Job -Job ($job = $(Start-Job -ScriptBlock $code -ArgumentList $h)) -Timeout $timeout 

或者像这样:

 $code = { Get-WmiObject -Class "Win32_ComputerSystem" -Namespace "root\cimv2" -ComputerName $args[0] } $jobstate = Wait-Job -Job ($job = $(Start-Job -ScriptBlock $code -ArgumentList $h)) -Timeout $timeout