0

我大约 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"
}

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

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

然后看看那个job的状态

$Job.State

我在失败所需的整整 15 秒内得到“运行”。我试图在其中添加Get-VariableScriptBlock {}但这也不起作用。它仍然显示已完成。因此,我认为这与由于语法或其他原因导致作业出错有关,因此无论如何,作业每次都会完成

4

1 回答 1

1

问题是您需要$server作为参数传递给脚本块,然后通过名为的自动变量引用它$args

$server = "test.contesto.net"
$Job = Start-Job -ScriptBlock {
    $server = $args[0]
    [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$server) 
} -ArgumentList @($server)

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

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

于 2015-01-10T13:56:58.560 回答