2012-07-05 3 views
3

PowerShell 신인이 있습니다. 아래의 변수를 구문 분석하기 위해 Select-String을 얻으려고 노력 중입니다.Powershell : 선택 -이 변수를 구문 분석하지 않는 문자열

모든 것을 표준 출력에 기록하는 외부 프로그램을 호출하고 있습니다. 이것은 내가 사용하고있는 백업 동기화 소프트웨어입니다. 출력은 소스, 대상, 복사 된 파일, 변경된 파일 등과 같은 많은 정보입니다. 표준 출력의 일부 항목 만 신경 씁니다. 표준 출력을 가져다가 관심있는 몇 가지 항목에 대해 구문 분석하려고하므로 기타 정보가 50 가지가 아닌 모든 정보 만 볼 수 있습니다.

$procInfo = New-Object System.Diagnostics.ProcessStartInfo 
$procInfo.FileName = "C:\Program Files\Siber Systems\GoodSync\gsync.exe" 
$procInfo.RedirectStandardError = $true 
$procInfo.RedirectStandardOutput = $true 
$procInfo.UseShellExecute = $false 
$procInfo.Arguments = "/progress=yes /exit sync DroboBackup" 
$proc = New-Object System.Diagnostics.Process 
$proc.StartInfo = $procInfo 
$proc.Start() | Out-Null 
(Get-Date -format T) + ": Backup Process Running. Please Stand By..." 
$proc.WaitForExit() 
if ($proc.ExitCode -eq 0) 
{ 
    "GoodSync Reported: Analyze or Sync Successfully Completed." 
} elseif ($proc.ExitCode -eq 1) 
{ 
    "GoodSync Error: Analyze had Terminal Errors. Did gsync.exe close abruptly?" 
} elseif ($proc.ExitCode -eq 2) 
{ 
    "GoodSync Error: Sync had Terminal Errors. Did gsync.exe close abruptly?" 
} else 
{ 
    "GoodSync Error: General Error. Typo in job name?" 
} 
$output = $proc.StandardOutput.ReadToEnd() 
$output += $proc.StandardError.ReadToEnd() 
#$output | Out-File c:\output.txt -Append 
$newOutput = $output | Select-String "Copy New","Copy Over","Delete File","Items Synced","Changes:" 
$newOutput 

내가이 프로그램을 실행 한 후 얻을하는 표준 출력에서 ​​모든 라인이다 :

여기에 코드입니다. 나는 내 좋고 깨끗한 파스칼 리턴을 얻지 못하고있다. 그래서 당신이 볼 수있는

$x = Get-Content c:\output.txt | Select-String "Copy New","Copy Over","Delete File","Items Synced","Changes:" 
$x 

PS C:\> .\test.ps1 

Changes: 0, Conflicts: 0, CopyTime: 0, CopyState: 0/0, Errors: 0 

:

그래서 시도하고 문제를 해결하기 위해, 나는 다음 텍스트 파일로 $output를 보낸 다음 실행, 그리고 이것은 내가 가진 무엇 텍스트 파일에 대해 작업하지만 변수로는 작업하지 않습니다.

어떤 통찰력이라도 있습니까?

답변

5

StreamReaderReadToEnd() 방법을 사용하여 표준 출력을 읽는 중입니다. 이 경우 캐리지 리턴을 포함하여 문자열이 반환됩니다. 따라서 파이프 라인에서이 문자열을 출력 할 때 Select-String은 개별 문자열이 아닌 하나의 큰 문자열 만 봅니다. 당신이 할 수있는 것은 파이프 라인을 통과하기 전에 캐리지 리턴에 문자열을 분할하는 것입니다 :

$output -split "`n" | Select-String "Copy New","Copy Over","Delete File","Items Synced","Changes:" 
+0

그 트릭을 했어! – Pat

관련 문제