about_Wildcards — PowerShell의 와일드카드
about_Wildcards — PowerShell의 와일드카드
파일 이름을 모아서 한 번에 처리할 때, 정확한 이름보다 '대충 이런 모양'을 기준으로 매칭하고 싶을 때가 있어요. PowerShell의 와일드카드 문자를 쓰면 일일이 이름을 나열하지 않아도 원하는 것만 골라낼 수 있는데요, 이 문서에서 그 쓰임을 차근차근 정리해 볼게요.
본문
간단한 설명
PowerShell에서 와일드카드 문자를 사용하는 방법을 설명해요.
자세한 설명
와일드카드 문자는 한 개 또는 여러 개의 문자를 대신해서 나타내요. 이걸 쓰면 명령어에 단어 패턴(word pattern)을 만들어 둘 수 있죠. 와일드카드 식(wildcard expression)은 -like 연산자와 함께 쓰거나, 와일드카드를 지원하는 파라미터 어디에든 쓸 수 있어요.
예를 들어 C:\Techdocs 디렉터리에 있는 .ppt 확장자 파일을 전부 매칭하려면 이렇게 입력해요:
Get-ChildItem C:\Techdocs\*.ppt
이때 별표(*) 와일드카드 문자는 .ppt 확장자 앞에 나타나는 어떤 문자든 대신해 줘요.
와일드카드 식은 정규 표현식(regular expression)보다 훨씬 단순해요. 정규 표현식에 대해서는 about_Regular_Expressions을 참고하세요.
PowerShell은 다음과 같은 와일드카드 문자를 지원해요.
*— 문자 0개 이상과 매칭a*는aA,ag,Apple과 매칭돼요a*는banana와는 매칭되지 않아요
?— 문자열에서 그 위치의 문자 1개와 매칭?n은an,in,on과 매칭돼요?n은ran과는 매칭되지 않아요
?— 파일·디렉터리에서 그 위치의 문자 0개 또는 1개와 매칭?.txt는a.txt,b.txt와 매칭돼요?.txt는ab.txt와는 매칭되지 않아요
[ ]— 문자의 범위(range)와 매칭[a-l]ook은book,cook,look과 매칭돼요[a-l]ook은took과는 매칭되지 않아요
[ ]— 특정 문자들과 매칭[bc]ook은book,cook과 매칭돼요[bc]ook은hook과는 매칭되지 않아요
`*— 어떤 문자든 리터럴 문자(와일드카드가 아닌 그 문자 자체)로 매칭12`*4는12*4와 매칭돼요12`*4는1234와는 매칭되지 않아요
한 단어 패턴 안에 와일드카드 문자를 여러 개 넣을 수도 있어요. 예를 들어 a부터 l까지의 문자로 시작하는 텍스트 파일을 찾으려면 이렇게 하면 돼요:
Get-ChildItem C:\Techdocs\[a-l]*.txt
때로는 문자를 와일드카드로 취급하지 말고 그 문자 그대로 매칭하고 싶을 때가 있어요. 그럴 땐 백틱(`) 문자로 와일드카드 문자를 이스케이프하면, 그 문자를 리터럴 문자 값으로 비교해 줘요. 예를 들어 '*hello`?*'는 "hello?"를 포함하는 문자열과 매칭돼요.
많은 cmdlet이 파라미터 값에서 와일드카드 문자를 받아들여요. 각 cmdlet의 도움말 항목에 어떤 파라미터가 와일드카드를 받는지 나와 있어요. 와일드카드를 받는 파라미터는 대소문자를 구분하지 않아요.
와일드카드 문자는 명령어와 스크립트블록에서도 쓸 수 있는데, 예를 들어 속성 값을 나타내는 단어 패턴을 만들어 둘 수 있어요. 다음 명령어는 ServiceType 속성 값에 Interactive가 포함된 서비스를 가져와요:
Get-Service | Where-Object {$_.ServiceType -like "*Interactive*"}
다음 예시의 if 문은 와일드카드 문자로 속성 값을 찾는 조건을 만들어 써요. 복원 지점의 Description에 PowerShell이 포함되어 있으면, 그 복원 지점의 CreationTime 속성 값을 로그 파일에 추가해 줘요:
$p = Get-ComputerRestorePoint
foreach ($point in $p) {
if ($point.Description -like "*PowerShell*") {
Add-Content -Path C:\TechDocs\RestoreLog.txt "$($point.CreationTime)"
}
}
파일·디렉터리 이름의 와일드카드 문자 이스케이프
참고 파일시스템 항목의 와일드카드 매칭은 문자열과는 다르게 동작해요. 자세한 내용은 DirectoryInfo.GetFiles(String, EnumerationOptions) 메서드의 Remarks 섹션을 참고하세요.
이름에 와일드카드 문자가 포함된 파일이나 디렉터리에 접근하려면 그 와일드카드 문자를 이스케이프해야 해요. 다음과 같은 파일들이 있다고 가정해 볼게요:
PS> Get-ChildItem
Directory: D:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/3/2025 3:39 PM 41 file[1].txt
-a--- 11/3/2025 3:39 PM 41 file[2].txt
-a--- 11/3/2025 3:39 PM 41 file[3].txt
대괄호([]) 문자는 와일드카드라서, Get-Item 같은 Item cmdlet으로 파일을 가져올 때는 이스케이프해 줘야 해요:
PS> Get-Item file`[1`].txt
그런데 이 예시는 실패했어요. 이름 값이 와일드카드를 지원하는 Path 파라미터에 바인딩되기 때문이에요. 이 경우 `[ 패턴이 순수한 [로 풀려서, Path 파라미터가 그걸 와일드카드로 해석해 버렸죠. 해결 방법은 세 가지예요.
백틱 문자를 이스케이프하기.
PS> Get-Item -Path file``[1``].txt
Directory: D:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/3/2025 3:39 PM 41 file[1].txt
파일 이름을 작은따옴표로 감싸서, Path 파라미터에 바인딩되기 전에 백틱이 확장되지 않게 하기.
PS> Get-Item -Path 'file`[1`].txt'
Directory: D:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/3/2025 3:39 PM 41 file[1].txt
LiteralPath 파라미터 사용하기.
PS> Get-Item -LiteralPath file[1].txt
Directory: D:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/3/2025 3:39 PM 41 file[1].txt