2016-09-06 2 views
0

주일에 한 번 실행되고 특정 파일 공유에 대한 모든 사용 권한을 조정하는 스크립트가 있습니다. 필자는 주로 PowerShell 스크립트를 사용하지만 일부 부분에서는 icacls.exe를 실행합니다. 많은 파일이 있기 때문에 icacls.exe를 실행할 때 오류가 발생합니다.PowerShell에서 icacls.exe의 모든 출력을 캡처하는 방법

스크립트 시작시 각 고객 폴더 및 모든 하위 항목의 모든 사용 권한을 재설정합니다. 이것의 한 부분은 객체 소유자를 재설정하는 것입니다.

나는 이와 같이 icacls.exe를 호출하고 있습니다. 오류가 발생 여부

$ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q | Out-String 

그때 확인하기 위해 특정 텍스트 문자열 $ICACLSResult을 확인하고 또한 내 오류 메시지 문자열 자체를 추가합니다.

if($ICACLSResult -notmatch "bei 0 Dateien ist ein Verarbeitungsfehler aufgetreten" -and $ICACLSResult -notmatch "Failed processing 0 files") 
{ 
    Add-Error -SED ($ErrorMSG + $ICACLSResult) -Level 2 -AddErrorInfo $False -ExitScript $False 

    Throw("AnErrorOccured") 
} 

그러나 변수 $ICACLSResult의 실제 내용은 다음과 같습니다.

Successfully processed 13970 files; Failed processing 5 files 

하지만 동일한 명령을 콘솔에서 직접 실행하면 다음과 같이 보입니다.

PS C:\Users\User> $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q | Out-String 

D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified. 
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified. 
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified. 
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified. 
D:\Folder1\Folder2\Folder3\File.txt: The system cannot find the path specified. 

PS C:\Users\User> 

그러나 다시 $ICACLSResult은 이와 같이 보입니다. 이러한 자세한 오류 메시지없이

PS C:\Users\User> $ICACLSResult 
Successfully processed 13970 files; Failed processing 5 files 

PS C:\Users\User> 

은, 그것이 말하는 모두가 많은 파일 구체적으로 어떤 파일 실패가 아니라 어떻게 때문에 변수 $ICACLSResult를 기록 아무 소용이 없다.

추가 정보를 어떻게 얻고 $ICACLSResult에 저장할 수 있습니까? 내가 원하는 것은 실패한 파일의 경로입니다. 그들이

,536,913,632를 작동하지 않는 이유는 무엇도 지금까지

  1. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1
  2. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 2>&1 | Out-String -Stream -Width 9999
  3. $ICACLSResult = icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q

을 시도했습니다 무엇

10

  1. 너무 많은 정보는, 줄 바꿈을
  2. 너무 많은 정보가 들어 바꿈을 포함
  3. 원하는 정보를 아직 변수 $ICACLSResult
+0

: HTTP : // stackoverflow.com/questions/39272345/handling-net-use-error-messages-with-powershell/39294208#39294208 – Paul

+1

문제 # 3의 경우 간단히'cmd/c "2> & 1"icacls ........를 실행하십시오. ............. ' – wOxxOm

+0

@wOxxOm 고맙습니다. 이 글을 답으로 게시하면 원한다면 받아 들일 수 있습니다. – mariu5

답변

1

cmd Windows 명령을 사용하는 출력의 오류를 유지하는 간단한 방법 STDERR을 STDOUT으로 재 지정하기위한 라인 유틸리티.이 cmd를 전달할 리디렉션 연산자 따옴표를 사용하여 예를 들어

$log = cmd /c "2>&1" someutilityname /some /parameters 

:

$log = cmd /c "2>&1" icacls "$OBJPath\*" /setowner $OBJOwner /t /c /q 

이제 $ 로그 출력 변수 문자열의 배열이다.

0

아마도 다른 방법으로, 당신이 얻을 수있는 동일한 가져 오기 - ACL이 설정 - ACL이 당신이 열려진 리디렉션 결국 또 다른 질문에서 모든 출력, here's 예를 잡기 위해 표준 출력한다

관련 문제