1

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并直接在作为作业运行的脚本块内进行分配?

简单来说:

$job = Start-Job -ScriptBlock {$a = 1 + 2}

如何在$a没有 的情况下等于 3 $a = (Get-job | Receive-job)

4

1 回答 1

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也接受工作名称或可以等待您的整个工作列表。

设置变量的另一个选项是

$RegHive = "Receive-Job -Name "RegHive"

最后,您可以这样做以使用该值

get-<insert command> -value "$(Receive-Job -Name 'RegHive' -Keep)" -argument2 "YADA YADA"

请记住,保留不会删除该值,以后可以再次“接收”。

于 2020-10-06T04:18:44.100 回答