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


243

하나의 파일뿐만 아니라 디렉토리의 모든 .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

답변:


363

이것을 시도하십시오 :

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')
}

감사. BaseName 부분이 작동하지 않습니다 (버전 1). 먼저 전체 파일의 백업을 만든 다음 원본 파일을 변경하여 관리했습니다.
user2725402

6
v1의 경우 다음을 사용하여 기본 이름을 추출 할 수 있습니다. [io.path] :: GetFileNameWithoutExtension ($ name)
Shay Levy

내가 교체하는 경우 BaseNameFullName내가 원하는 것을 얻을.
M--

78

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

$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
}

"out.log"라는 하나의 출력 파일이 생성됩니다. 각 입력 파일에 대해 별도의 출력 파일을 작성하는 방법
user2725402

@ user2725402 <input file name> out이라는 입력 종속 출력 파일을 추가했습니다
PVitt

내가 뭘 잘못하고 있는지 잘 모르겠지만 작동하지 않습니다. 이제 출력 파일과 오류가 발생하지 않습니다. $files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\" $files | Where-Object { $outFile = $_.Name + "out" Get-Content $_.FullName | Where-Object { $_ -match 'step4' -or $_ -match 'step9' } | Set-Content $outFile }
user2725402

2
당신은 또한 할 수 있습니다foreach ($f in Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\") { ... }
Soapy

1
또는 사용ForEach ($f in $files){...}
Mark Schultheiss

31

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

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

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

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

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


나를 괴롭힌 것은 숨겨진 파일 및 / 또는 시스템 파일이 누락되었다는 것입니다. 또한 이들을 보려면 -ForceGet-ChildItem에 매개 변수를 사용해야합니다 . docs.microsoft.com/en-us/powershell/module/… 에서 해당 문서를 참조하십시오 .
til_b

-6

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

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

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

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

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

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


18
이 질문은 유닉스가 아닌 PowerShell로 태그되었습니다
SteveC

2
예. 명백하게. 필자는 상당히 간단했다. Windows에서 GNUWin32 유틸리티를 사용할 수 있으므로 Powershell에서 * nix 도구를 쉽게 사용할 수있다. 공장. 아무도 대답이 전적으로 Powershell에 고유해야한다고 말한 적이 없습니다. 그리고 그래도 Powershell에서 직접 Win32 유틸리티를 호출 할 수 있습니다. 사용 가능하고 호환되는 것을 사용하는 AFAIK는 실제로 나쁜 것이 아닙니다.
user1628658

2
필자는 이전 의견을 편집했지만 5 분 제한을 통과했습니다. SteveC : Windows에서 잘 작동하는 GNU 도구를 통합하는 것이 어떻게 든 Powershell을 무시한다고 말하는 것입니까? 한 가지입니다. Powershell에서 순수하게 작업하면 단기적으로 생산성이 높아질 수 있음을 이해합니다. 장기적으로 가능성을 확대하면 실제로 더 많은 장점이 있습니다. Cygwin과 같은 Linux 에뮬레이터없이 더 많은 옵션을 추가하고 Windows 및 Powershell에서 완전히 작동합니다. 그래서 나는 당신의 예약을 이해하지만 동의하지 않습니다.
user1628658

5
문제는 사용할 수있는 다른 여러 언어가 아니라 PowerShell에서 보는 것입니다.
SteveC

1
대답은 질문에 대한 것입니다. 이 질문은 PowerShell에서 답변을 원한다는 점에서 명백했습니다. 당신의 대답은 무언가를 설치하고 사용하는 것입니다. Ruby 등을 설치하도록 제안 할 수 있습니다.
SteveC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.