Присваивать переменную внутри блока скриптов во время выполнения задания

Связано с завершением части сценария powershell и продолжением.
Частично связано с работой Powershell, всегда показывает, что выполнено.

Мой скрипт запускается локально и обращается к кусту реестра удаленного ПК. Мне нужно, чтобы значение ключей реестра было записано в $RegHive переменная. И я хочу контролировать это как работу в случае зависания какого-либо ПК, я могу прекратить выполнение команды и перейти к другому ПК.

Мой оригинальный код будет:

$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)?

0 ответов

Это может быть вам полезно. Задание похоже на переменную. Вы можете назвать задание, а затем называть его по имени с помощью -Keepчтобы сохранить его значение - иначе, он будет хранить весь окончательный вывод внутри себя, пока вы его не вызовете. (его можно сохранить, но по умолчанию его удаляют после вызова)

$global:RegHive = $null
Start-Job -Name "RegHive" -ScriptBlock {
    [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("SomeKeyName", "SomePCName")
}
Receive-Job -Name "RegHive" -Keep

очевидно называя Receive-Jobсразу после поражения цели задания они добавляют много накладных расходов и эффективны только тогда, когда необходимо выполнять несколько задач одновременно. - если вы звоните сразу по сотням или тысячам, вы можете сделать get-job | wait-job затем, когда закончите, начните использовать их выходы ---- wait-job также принимает имена вакансий или может ждать выполнения всего вашего списка вакансий.

другой вариант установки переменной -

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

и, наконец, вы можете сделать это, чтобы использовать значение

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

помните, что keep не удалит значение и может быть снова "получено" позже.

Другие вопросы по тегам