运行作业时的参数解释
$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