2012-01-13 4 views
1

반환 값이 왜곡되는 곳을 찾기 위해 전체 시간을 보냈습니다. 이제 마침내 어디에서 발견했는지, 나는 아직도 이유를 모른다. 함수는 다음과 같습니다.프로세스가 포함 된 함수가 깨진 값을 반환합니다.

function Run-RemoteCommand { 
param(...) # params are $Remote (host) $Command $Credentials $Quiet (optional switch) 

    if($Quiet) { 
     $Process = New-Object System.Diagnostics.Process 
     $Process.StartInfo.UseShellExecute=$false 
     $Process.StartInfo.Domain=$Credentials.GetNetworkCredential().Domain 
     $Process.StartInfo.UserName=$Credentials.GetNetworkCredential().UserName 
     $Process.StartInfo.Password=$Credentials.Password 
     $Process.StartInfo.WindowStyle="Hidden" 
     $Process.StartInfo.FileName=$PSExec 
     [email protected]("/acceptEULA",$Remote,"-s",$Command) 
     $Process.Start() 
     $Process.WaitForExit() 
     $result = $Process.ExitCode 
     return $result 
    } else { 
     ... 
    } 
} 

이상한 점은 디버거에서 단계별로 처리하고 모든 것이 잘 작동 하는지를 보는 것입니다. 명령이 실행되면 $ result는 리턴 코드로 채워지지만 호출 함수는 리턴 코드에 True를 추가합니다 (예 : 성공시 True0). 반환 값을 무시하고 그냥 말하려고했습니다.

return "false" 

호출 함수가 "Truefalse"를받습니다. 내가 알 수있는 것은 그것이 $ Process Running에 묶여 있다는 것이다. $ Process.Start()를 주석 처리하면 리턴 코드가 정상적으로 작동합니다. 누군가 내 제 정신을 구 해주세요.

답변

3

$ Process.Start() 성공하면 참인 부울 값을 반환합니다. PowerShell의 함수는 표준 프로그래밍 언어와 다르게 동작합니다. PowerShell 함수는 변수로 캡처되거나 파일이나 Out-Null로 리디렉션되지 않은 명령 출력을 "반환"하거나 더 기술적으로 "출력"합니다. 더 깊은 설명은

[void]$Process.Start() 

또는

$Process.Start() | Out-Null 

체크 아웃 this blog post이 경우 시작 라인을 변경합니다.

+0

고마워요, 키이스, 지금 제가 꺼내 려던 머리를 구하기 위해 Rogain에 모든 돈을 쓸 필요는 없습니다! 그 링크에서 좋은 독서. 특히 여기에 적용되는 부분이 시작됩니다. "이 문제가 PowerShell 뉴스 그룹에서 다시 한 번 물었습니다 ..." – ASTX813

관련 문제