Get-ChildItem: PowerShell을 사용하여 파일 및 폴더 나열하기

DOS dir 명령어를 기억하시나요? Linux의 ls 명령어도요? 그렇다면 Get-Childitem은 그런데서 한 단계 더 나아간 것입니다.

실제로 PowerShell에서도 dirls를 별칭(alias) 형태로 지원합니다. Get-Childitem PowerShell cmdlet은 PowerShell 콘솔이나 PowerShell 스크립트를 통해 파일 시스템의 파일과 폴더를 나열할 뿐만 아니라 레지스트리 키와 값, 다양한 인증서 저장소의 인증서, 심지어는 Active Directory까지 열거할 수 있습니다.

PowerShell 스크립터로서의 초보자/중급자라면 무료 미니 코스인 ‘PowerShell 도구 만들기’를 꼭 확인해보세요! PowerShell 도구를 만드는 방법에 대한 깊은 설명과 통찰력이 담겨있는 9,000단어 이상의 코스입니다.

Get-Childitem을 이해하기 위해서는, 먼저 파일이 아닌 다른 객체들을 하위 항목으로 취급하고 열거한다는 점에서 dirls와 비슷하다고 생각하세요. 별칭 또는 전체 명령어 이름을 사용하여 이를 사용할 수 있습니다.

이 명령어는 PowerShell v1부터 사용 가능하므로, 사용하시는 PowerShell 버전과 호환될 것입니다.

Get-ChildItem은 트리를 탐색합니다.

A file system is a hierarchy. It has a folder structure with files inside of folders and those folders inside of other folders. A file system is like a tree. That tree has a trunk (C:\ for example) and “branches” coming off of it (folders). In fact, we even have a tree command.

PS> tree
Folder PATH listing for volume HD
Volume serial number is 0000007B 22DC:666C
C:.
 \modules
   \AdsiPS
     \1.0.0.2
       \Public
       \AWSPowerShell
<SNIP>

이 명령어를 로컬 컴퓨터의 로컬 경로에 사용하거나, PowerShell 원격 스크립트 블록을 사용하고 그 안에 Get-ChildItem을 사용하거나, UNC 경로를 사용할 수 있습니다. 모두 동일하게 작동합니다. 현재 디렉토리의 모든 파일을 나열하고 싶을 수도 있습니다.

PS> dir -Path .
PS> Invoke-Command -ComputerName SERVER1 -Scriptblock { dir -Path . }

PowerShell 공급자

이 사용자 지정 명령을 번역할 수 있습니다. 다음은 한국어로 된 번역입니다:

Microsoft는 파일 시스템의 “트리” 구조를 탐색하는 것이 다른 시스템에도 적용될 수 있다는 것을 깨달았습니다. 파일 시스템 “트리”에는 폴더와 파일이 있지만 레지스트리에는 키와 값이 있으며 Windows의 인증서 시스템에는 해당 스토어 내부에 스토어와 인증서가 있습니다. 이러한 특정 영역 각각은 모두 트리로 표현될 수 있으므로 PowerShell 프로바이더가 탄생했습니다. PowerShell 프로바이더에 대한 이 모든 이야기는 왜인지 궁금할 수 있습니다. 왜냐하면 Get-ChilldItem cmdlet이 각 프로바이더가 노출하는 PowerShell 드라이브와 상호 작용하는 *-Item cmdlet의 일부이기 때문입니다.

Get-ChildItem cmdlet은 PowerShell 드라이브에서 어떤 수의 개체든 출력할 수 있으며, 각 항목을 파이프 라인을 통해 또는 아마도 PowerShell foreach 루프에서 처리할 수 있습니다. 이는 파일 시스템 폴더, 레지스트리 키 또는 인증서 스토어의 Path를 지정할 수 있는 PowerShell 드라이브의 개념을 이해합니다.

아래에서 이 명령이 C:\ 폴더, HKEY Current User 하이브, 그리고 PowerShell 인증서 스토어를 열거할 수 있다는 것을 볼 수 있습니다.

PS> Get-ChildItem -Path C:\


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         7/2/2017   7:01 AM                AppData
d-----        4/25/2017   4:36 PM                CheckPoint

PS> Get-ChildItem -Path HKCU:\


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
BCD00000000

PS> dir -Path Cert:\


Location   : CurrentUser
StoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}

필터링

Get-ChildItem PowerShell 명령어는 드라이브에서 모든 객체를 가져오는 뿐만 아니라 몇 가지 다른 매개변수를 통해 정보를 필터링할 수도 있습니다: Filter, Include, 그리고 Exclude. 가능하다면 항상 만능 PowerShell Filter 매개변수를 사용하는 것이 좋습니다. 이 매개변수는 필터 구문을 개별 공급자에 직접 전달합니다. 훨씬 빠르지만, 이 구문은 질의되는 공급자에 달려 있습니다.

예를 들어, 파일을 쿼리할 때 Name -eq 'foo'와 같은 Filter 구문은 완전히 정상일 수 있지만 레지스트리를 쿼리할 때는 전혀 작동하지 않습니다. 왜냐하면 레지스트리 공급자에는 심지어 필터가 없기 때문입니다!

PS> dir HKLM:\ -Filter "Name -eq 'foo'"
ls : Cannot call method. The provider does not support the use of filters.
At line:1 char:1 + ls HKLM:\ -Filter "Name -eq 'foo'" +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          :
NotImplemented: (:) [Get-ChildItem], PSNotSupportedException     +
FullyQualifiedErrorId :
NotSupported,Microsoft.PowerShell.Commands.GetChildItemCommand

하지만 모든 것이 실패할 때에도 항상 IncludeExclude 매개변수를 사용할 수 있습니다.

이 PowerShell 명령어에는 Force와 같이 파일 시스템별 매개변수도 있습니다. 이는 숨겨진 파일과 폴더를 출력하는 Force 매개변수, 파일 또는 폴더만 찾는 FileDirectory 등입니다. Get-ChildItem의 전체 분석은 Get-Help 또는 Microsoft docs에서 확인할 수 있습니다.

Get-ChildItem의 또 다른 멋진 점은 와일드카드 문자를 사용할 때 경로를 해석할 수 있는 능력입니다. PowerShell에서 와일드카드 문자는 일반적으로 모든 것을 나타냅니다. 예를 들어, .txt 파일 확장자를 가진 모든 파일을 보고 싶다면 폴더 경로를 지정하고 *.txt를 지정하면 됩니다.

PS> Get-ChildItem -Path 'C:\*.txt'

저희는 파일 속성에 대한 필터링도 할 수 있습니다. 어쩌면 특정 폴더에서 읽기 전용 파일만 찾고 싶을 수도 있습니다.

PS> Get-ChildItem -Path C:\ -Attributes R -File

요약

이 PowerShell 명령은 여러 차례 사용하게 될 명령어 중 하나입니다. 대부분의 경우에는 파일 시스템 공급자를 사용할 것이지만 이 명령은 훨씬 더 다양한 기능을 갖고 있음을 기억하는 것이 중요합니다. 이 명령을 사용하여 파일, 폴더, 레지스트리 키, 레지스트리 값, 인증서, Active Directory 사용자, 컴퓨터 또는 환경 변수, 함수 등을 조회할 수 있습니다!

의심스러울 때는 Get-PSDrive 명령을 실행하여 Get-ChildItem이 조회할 수 있는 모든 로드된 PowerShell 드라이브 목록을 확인하세요.

Source:
https://adamtheautomator.com/get-childitem/