2015-01-10 4 views
0

약 3 일 전부터 powershell을 사용하기 시작했습니다. 원격 컴퓨터의 레지스트리에 액세스하고 특정 키를 찾아 출력을 파일에 저장하는 스크립트를 만들려고했습니다.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" 
} 

와 나는 항상 "그것을"얻을 것이다. 심지어 내가 그 서버 레지스트리에 도달 할 수 없다는 것을 알고 있습니다.

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

가 그럼 난 전체 (15)은 "실행"을 얻을 해당 작업

$Job.State 

의 상태를 보면 :이 같은 파워 쉘 프롬프트에 수동으로 모든 것을 입력하면 이상한 일이있다 실패하는 데 걸리는 시간. 나는 ScriptBlock {}Get-Variable을 추가하려고 시도했지만 그 중 하나도 작동하지 않았습니다. 아직 완성 된 것으로 나타납니다. 그래서 나는 그것이 구문과 같은 오류로 인해 작업과 관련이 있다고 생각하고 있습니다. 그래서 언제든지 작업이 완료됩니다.

+0

적어도 작업 내용으로 설명 할 부분은 아닙니다. 그렇다면 왜 복잡성 계층을 추가해야할까요? – alroc

+0

이 복잡성 계층을 추가하려는 이유는 [Microsoft.Win32.RegistryKey] :: OpenRemoteBaseKey ("LocalMachine", "test.contesto.")에 걸리는 기본 15 초를 기다리지 않기 때문입니다. net ") 명령을 완료하십시오. 대신 1 초 또는 1 초 미만 만 기다리고 싶습니다. 이 일을하는 다른 방법이 확실하지 않습니다. 나는 당신이 이것을 성취하는 방법을 가지고 있다면 다른 아이디어를 얻고 싶어합니다. 저는 이것을 여러 대의 기계에서 실행할 예정이며, 실패 할 것이라는 것을 알기 위해 15 초가 필요하지 않습니다. – Ivory

답변

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를 적절히 전달하면 작업에서 원격 키를 검색 한 다음 시간이 초과됩니다.

+1

나는'$ using : server'를 사용하여 이와 같이 스크립트 블록에 사용 된 지역 변수를 해결할 수 있다고 생각합니다. 잡스에서 작동한다고 말할 수는 없지만 Invoke-command, 워크 플로 및 DSC 스크립트 리소스에서 작동한다는 것은 알고 있습니다. 그러나 당신은이 방법으로 인자 목록을 피할 수 있고 코드는 더 깨끗해진다. – kevmar

+0

예'$ using : variable'은 백그라운드 작업에서 작동합니다. –

+0

감사! 그게 바로 그 것이 었습니다. 너무 바보 같아, 그런 간단한 대답. 나는 내가 잘못하고있는 어떤 구문 일 것이라고 생각했다. "$ using : server"는 큰 도움이됩니다! 나는 그것을 확실히 사용할 것이다. – Ivory