【问题标题】:Assign a variable inside of a scriptblock while running a job在运行作业时在脚本块内分配一个变量
【发布时间】:2018-09-22 07:15:17
【问题描述】:

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 = (Get-job | Receive-job),如何让$a等于3?

【问题讨论】:

  • 作业在单独的进程中执行。活动对象不能通过进程边界。
  • @PetSerAl,那这不可能吗?没有解决方法?比如可能将指针作为参数/全局变量/调用写入全局变量的函数传递(我尝试了最后两个,但无法使其工作)?
  • 是的。此外,我不明白为什么你甚至想要传回配置单元对象而不是完成工作中的工作。
  • @AnsgarWiechers 重点是:我需要密钥本身的值(称为$RegHive)以供以后使用。否则我将不得不在这个作业中添加整个脚本并在那里处理键值。如果这有意义的话,我想......
  • 真正的问题是,在调用注册表值这样的快速操作中,为什么需要为它分配工作呢? - nvm 你说你有 getsubkeyname() 的问题

标签: powershell powershell-jobs


【解决方案1】:

这可能对您有所帮助。这项工作有点像一个变量 您可以做的是为作业命名,然后使用 -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"

记住keep不会删除值,以后可以再次“接收”。

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多