我刚刚开始使用PowerShell大约3天前,我一直在尝试创建一个脚本来访问远程计算机的注册表并查找某个键并将输出放入文件中。
我已经能够让它工作了但是我注意到如果它无法到达注册表,则需要大约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.State
我得到"跑步"失败所需的整整15秒。我尝试在Get-Variable
中添加ScriptBlock {}
,但这也不起作用。它仍显示已完成。因此,我认为它与由于语法或其他事情而导致错误的工作有关,所以无论什么时候工作都会完成
答案 0 :(得分: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,作业将尝试检索远程密钥,然后超时。