Powershell 作业总是显示完成

Powershell Job Always Shows Complete

我大约 3 天前才开始使用 powershell,我一直在尝试制作一个脚本来访问远程计算机的注册表并查找某个键并将输出放入文件中。

我已经能够让它工作,但我注意到如果它无法到达注册表,大约需要 15 秒才能出错并继续执行脚本,所以我将其放入:

$Server = "test.contesto.net"

$Job = Start-Job ScriptBlock{[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$Server)

Start-Sleep 2

If ($Job.State -EQ "Completed"){
write-host "made it"
}
Else {
write-host "failed"
}

我将永远得到 "made it"。即使我知道我无法访问该服务器注册表。奇怪的是,如果我手动将所有这些输入到 powershell 提示符中,如下所示:

$Job = Start-Job ScriptBlock {[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine","test.contesto.net") 

然后看看那个作业的状态

$Job.State

我得到 "Running" 失败所需的整整 15 秒。我试图在 ScriptBlock {} 中添加 Get-Variable 但这也不起作用。还是显示完成。所以我认为这与由于语法或其他原因导致的作业错误有关,因此无论如何作业每次都会完成

问题是您需要将 $server 作为参数传递给您的脚本块,然后通过名为 $args:

的自动变量引用它
$server = "test.contesto.net"
$Job = Start-Job -ScriptBlock {
    $server = $args[0]
    [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$server) 
} -ArgumentList @($server)

后台作业 运行 在与当前脚本完全不同的上下文中,因此不会看到本地定义的变量。

因此在您的情况下,作业立即失败,因为 $server 等于 $null。 通过适当地传递 $server ,作业将尝试检索远程密钥,然后超时。