[powershell] PowerShell을 사용하여 디렉토리의 파일을 반복

하나의 파일뿐만 아니라 디렉토리의 모든 .log 파일을 보려면 다음 코드를 어떻게 변경합니까?

모든 파일을 반복하고 “step4″또는 “step9″가 포함되지 않은 모든 줄을 삭제해야합니다. 현재 이것은 새로운 파일을 만들지 만 for each여기서 루프 를 사용하는 방법을 모르겠습니다 (초보자).

실제 파일 이름은 2013 09 03 00_01_29.log 입니다. 출력 파일을 덮어 쓰거나 SAME 이름을 “out”으로 추가하고 싶습니다.

$In = "C:\Users\gerhardl\Documents\My Received Files\Test_In.log"
$Out = "C:\Users\gerhardl\Documents\My Received Files\Test_Out.log"
$Files = "C:\Users\gerhardl\Documents\My Received Files\"

Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out



답변

이것을 시도하십시오 :

Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files" -Filter *.log |
Foreach-Object {
    $content = Get-Content $_.FullName

    #filter and save content to the original file
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content $_.FullName

    #filter and save content to a new file 
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content ($_.BaseName + '_out.log')
}


답변

사용할 수있는 디렉토리의 내용을 얻으려면

$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"

그런 다음이 변수를 반복 할 수도 있습니다.

for ($i=0; $i -lt $files.Count; $i++) {
    $outfile = $files[$i].FullName + "out"
    Get-Content $files[$i].FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}

이것을 넣는 더 쉬운 방법은 foreach루프입니다 (@Soapy 및 @MarkSchultheiss 덕분에).

foreach ($f in $files){
    $outfile = $f.FullName + "out"
    Get-Content $f.FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}


답변

특정 종류의 파일에 대해 디렉토리 내부에서 반복적으로 루프를 반복해야하는 경우 doc파일 유형 의 모든 파일을 필터링하는 아래 명령을 사용하십시오.

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc

여러 유형에 대해 필터링을 수행해야하는 경우 아래 명령을 사용하십시오.

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf

이제 $fileNames변수는 비즈니스 로직을 반복하고 적용 할 수 있는 배열의 역할을합니다 .


답변

다른 대답은 훌륭합니다. PowerShell에 사용할 수있는 다른 접근법 : GNUWin32 유틸리티를 설치하고 grep을 사용하여 라인을 보거나 출력을 파일 http://gnuwin32.sourceforge.net/로 리디렉션하십시오.

매번 새 파일을 덮어 씁니다.

grep "step[49]" logIn.log > logOut.log 

이것은 logIn 파일을 겹쳐 쓰고 데이터를 유지하려는 경우를 대비하여 로그 출력을 추가합니다.

grep "step[49]" logIn.log >> logOut.log 

참고 : GNUWin32 유틸리티를 전체적으로 사용하려면 bin 폴더를 시스템 경로에 추가해야합니다.


답변