与Terminate part of powershell script and continue相关 与Powershell Job Always Shows Complete部分相关。
我的脚本在本地运行并访问远程PC的注册表配置单元。我需要将注册表项的值写入$RegHive
变量。我希望监视它作为一项工作以防一些PC死机,我可以终止命令并转移到另一台PC。
我原来的代码是:
$global:RegHive = $null
$job = Start-Job -ScriptBlock {
$RegHive = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("SomeKeyName", "SomePCName")
}
但无论我做什么,变量$RegHive
都是空的。
如果我$RegHive = (Get-Job | Receive-Job)
某个值被分配给$RegHive
,那么一方面看起来就像我没有作业/脚本块那样正常运行,即:
$RegHive = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("SomeKeyName", "SomePCName")
甚至具有相同的$RegHive.SubKeyCount
但是“正常”的方法有$RegHive.GetSubKeyName()
方法,而工作方法则没有。
如何逃避使用Receive-Job
分配变量并直接在scriptblock中执行赋值,该块作为作业运行?
简单来说:
$job = Start-Job -ScriptBlock {$a = 1 + 2}
如果没有$a
,$a = (Get-job | Receive-job)
如何等于3?
答案 0 :(得分:0)
这可能对您有帮助。工作有点像变数
您可以做的就是命名该作业,然后使用-Keep
对其进行命名以保持其值存储-也就是它将所有最终输出存储在其内部,直到您调用它为止。 (它可以保留,但默认是在调用后将其删除)
$global:RegHive = $null
Start-Job -Name "RegHive" -ScriptBlock {
[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("SomeKeyName", "SomePCName")
}
Receive-Job -Name "RegHive" -Keep
很明显,在打败工作目的之后立即调用Receive-Job
,它们增加了很多开销,并且仅在需要一次执行多项操作时才有效。 -如果一次调用100或数千,则可以进行get-job | wait-job
,然后在完成使用它们的输出时开始使用---- wait-job
也接受作业名称或可以等待您的整个作业列表。 / p>
设置变量的另一个选项是
$RegHive = "Receive-Job -Name "RegHive"
最后,您可以执行此操作以使用值
get-<insert command> -value "$(Receive-Job -Name 'RegHive' -Keep)" -argument2 "YADA YADA"
记住keep不会删除该值,以后可以再次“接收”。