1

powershell スクリプトの一部を終了して続行する に関連します。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明らかに、ジョブの目的を無効にした直後に呼び出すと、多くのオーバーヘッドが追加され、一度に複数のことを行う必要がある場合にのみ効率的になります。-一度に数百または数千を呼び出す場合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 に答える