Присваивать переменную внутри блока скриптов во время выполнения задания
Связано с завершением части сценария 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 не удалит значение и может быть снова "получено" позже.