code

PowerShell을 사용하여 디렉토리 내의 파일을 루프합니다.

starcafe 2023. 4. 23. 11:00
반응형

PowerShell을 사용하여 디렉토리 내의 파일을 루프합니다.

다음 코드를 변경하여 1개의 파일뿐만 아니라 디렉토리 내의 모든 .log 파일을 참조하려면 어떻게 해야 합니까?

모든 파일을 루프하여 "step4" 또는 "step9"가 포함되지 않은 행을 모두 삭제해야 합니다.현재 새 파일이 생성되지만, 이 파일을 사용하는 방법을 잘 모르겠습니다.for each여기(초보자)에 루프하다

실제 파일의 이름은 다음과 같습니다.2013 09 03 00_01_29.log출력 파일을 덮어쓰거나 같은 이름에 "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
}

이걸 더 쉽게 표현하자면foreachloop(@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

지금이다$fileNamesvariable은 비즈니스 로직을 루프하여 적용할 수 있는 배열로 기능합니다.

다른 답변도 괜찮고, 덧붙이고 싶은 건...PowerShell에서 사용할 수 있는 다른 접근법: GNUWin32 utils를 설치하고 grep를 사용하여 행을 표시하거나 출력을 http://gnuwin32.sourceforge.net/ 파일로 리다이렉트 합니다.

이렇게 하면 매번 새 파일이 덮어씁니다.

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

logIn 파일을 덮어쓰고 데이터를 유지하려는 경우 로그 출력이 추가됩니다.

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

주의: GNUWin32 유틸리티를 글로벌하게 사용하려면 시스템 경로에 bin 폴더를 추가해야 합니다.

언급URL : https://stackoverflow.com/questions/18847145/loop-through-files-in-a-directory-using-powershell

반응형