Работа Powershell всегда показывает выполненную
Я только начал работать с 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 {}
но это тоже не сработало. Это все еще показывает завершено. Так что я думаю, что это связано с ошибкой задания из-за синтаксиса или чего-то еще, поэтому задание выполняется каждый раз, независимо от того, что
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 соответствующим образом, задание попытается получить удаленный ключ, а затем истечет время ожидания.