在运行作业时在脚本块内部分配变量

时间:2018-04-12 08:19:36

标签: powershell powershell-jobs

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?

1 个答案:

答案 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不会删除该值,以后可以再次“接收”。