IT story

PowerShell을 사용한 재귀 파일 검색

hot-time 2020. 4. 21. 08:21
반응형

PowerShell을 사용한 재귀 파일 검색


모든 폴더에서 파일을 검색하고 있습니다.

Copyforbuild.bat 많은 곳에서 사용할 수 있으며 재귀 적으로 검색하고 싶습니다.

$File = "V:\Myfolder\**\*.CopyForbuild.bat"

PowerShell에서 어떻게 할 수 있습니까?


사용 가져 오기-ChildItem을의 와 cmdlet에 -Recurse스위치를 :

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

보안 (예 :)에 따라 오류가 발생할 수있는 폴더를 검색 할 때는 C:\Users다음 명령을 사용하십시오.

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

나는 이것을 사용하여 파일을 찾은 다음 PowerShell이 ​​결과의 전체 경로를 표시하게합니다.

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}

및 / 또는 *에서 와일드 카드 항상 사용할 수 있습니다 . 예를 들면 다음과 같습니다.FolderNameFileName.fileExtension

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}

위의 예는 C:\드라이브에서 단어로 시작 하는 모든 폴더를 검색합니다 Folder. 따라서 이름이 지정된 폴더가 FolderFoo있고 FolderBarPowerShell은 두 폴더 모두의 결과를 표시합니다.

파일 이름과 파일 확장자도 마찬가지입니다. 특정 확장자를 가진 파일을 검색하려고하지만 파일 이름을 모르는 경우 다음을 사용할 수 있습니다.

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

혹은 그 반대로도:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

작동합니다


이 시도:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}

와일드 카드를 사용하여 필터링 :

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

정규식을 사용하여 필터링 :

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }

다음은 고군분투 한 후에 마침내 생각해 낸 방법입니다.

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

출력을 더 깨끗하게 만들려면 (경로 만) 다음을 사용하십시오.

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

첫 번째 결과 만 얻으려면 다음을 사용하십시오.

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

이제 중요한 것들 :

파일 만 검색하려면 / 디렉토리는 않습니다 하지 사용 -File또는 -Directory(이유는 아래 참조). 대신 파일에 이것을 사용하십시오.

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

-eq $falsefor 디렉토리를 제거하십시오 . 마십시오 하지 같은 후행 와일드 카드를 남겨 bin/*.

내장 스위치를 사용하지 않는 이유는 무엇입니까? 그들은 끔찍하고 무작위로 기능을 제거합니다. 예를 들어 -Include파일과 함께 사용 하려면 경로를 와일드 카드로 끝내야합니다. 그러나 이렇게하면 -Recurse사용자에게 알리지 않고 스위치가 비활성화됩니다 .

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

*.lib모든 하위 디렉토리의 모든 것을 제공 할 것이라고 생각 하지만 최상위 레벨 만 검색합니다 bin.

디렉토리를 검색하려면을 사용할 수 -Directory있지만 후행 와일드 카드를 제거해야합니다. 어떤 이유로 든 비활성화되지 않습니다 -Recurse. 이러한 이유로 내장 플래그를 사용하지 않는 것이 좋습니다.

이 명령을 상당히 단축 할 수 있습니다.

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

된다

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem 에 별칭입니다 gci
  • -Path 기본적으로 위치 0으로 설정되므로 첫 번째 인수 경로를 만들 수 있습니다.
  • -Recurse 에 별칭입니다 -s
  • -Include 속기가 없습니다
  • 이름 / 경로에서 공백에 작은 따옴표를 사용하면 전체 명령을 큰 따옴표로 묶고 명령 프롬프트에서 사용할 수 있습니다. 다른 방법으로 (작은 따옴표로 둘러싼)하면 오류가 발생합니다.

참고 URL : https://stackoverflow.com/questions/8677628/recursive-file-search-using-powershell

반응형