2017-01-18 6 views
2

PowerShell의 type -wait 명령을 사용하여 실제 로그 파일을 모니터링하려고합니다. 리눅스에서 tail -f을 사용하는 것과 동일한 방식으로 Windows에서 시간을 측정했으며 파일을 다른 명령 인 select-string (예 : grep)에 파이프 처리하여 조건에 따라 동작을 트리거합니다. 리눅스에서는, 내가하려고하는 것을 이루기 위해서 watch을 사용할 것이다.PowerShell의 유형을 사용하십시오. select-string을 사용하여 실시간으로 응용 프로그램 로그를 모니터링하고 (tail -f 또는 watch와 같은) 동작을 실행하십시오.

다음 예제에서는 문자열 "status=Caught"이 포함 된 새 줄이 로그 파일에 기록 될 때마다 "You caught a critter!"이라는 문구를 인쇄하려고합니다.

while (1) {if (type -wait "$env:USERPROFILE\AppData\Roaming\CritterCatcherApp\Logs\CritterBag-170118.log" | select-string -quiet "state=Caught") {write-host "You caught a critter!"} else {continue}} 

주의하시기 바랍니다 select-string 명령이 리턴 True에 대한 -quiet 인수입니다. 사실,이 예제에서는 로그 파일에 문자열이 "status=Caught" 인 기존 행이 있기 때문에 명령을 처음 실행했을 때 한 번만 True을 반환합니다.

필자는 기존 문자열을 간과해야합니다 (예 : 로그 파일 회전). 그러나 지금 당장은 파일의 꼬리말을 계속할 필요가없는 PowerShell 스크립트가 필요합니다. 파일에 작성된 각 행마다 주어진 문자열이 들어 있는지 여부를 계속해서 평가합니다. 그런 다음 문자열이 있으면 선 인쇄와 같은 임의의 작업을 실행해야합니다. 그렇지 않으면 문자열을 계속 듣습니다.

다음 게시물은 -wait 인수가 Get-Content cmdlet에 대한 옵션 인 것을 나타냅니다. How to monitor a windows log file in real time?. 이 게시물에 설명 된대로 이 foreach 루프와 함께 작동해야하는지 확실하지 않습니다 : In Powershell can i use the select-string -quiet switch within a foreach statement.

위의 PowerShell 스크립트를 수정하여 로그 파일을 끝내고 지정된 문자열로 새 줄마다 작업을 실행하고 파일을 계속 꼬리를 맞추고 작성된대로 새 줄을 평가할 수 있습니까?

답변

1

당신은 Where-Object (?)ForEach-Object (%)와 파이프 라인에 작업을 수행 할 수 있습니다

Get-Content file -wait | ? { $_ -match "status=Caught" } | % { Write-Host "You caught a critter!" } 

status=Caught 파일에서 감지마다의 ForEach-ObjectWrite-Host 당신은 그것을 가지고

+0

를 실행합니다 - 그것은 작동합니다. 이것은 분명히 해답이며, 코드의 한 줄에서 우아한 해결책입니다. 필자는 파일의 기존 항목으로 인해'Write-Host' 출력을 몇 번 얻었고 해결은 다음 단계가 될 것입니다. 고맙습니다. –