about_Wildcards — PowerShell의 와일드카드

about_Wildcards — PowerShell의 와일드카드

파일 이름을 모아서 한 번에 처리할 때, 정확한 이름보다 '대충 이런 모양'을 기준으로 매칭하고 싶을 때가 있어요. PowerShell의 와일드카드 문자를 쓰면 일일이 이름을 나열하지 않아도 원하는 것만 골라낼 수 있는데요, 이 문서에서 그 쓰임을 차근차근 정리해 볼게요.

출처: Microsoft Learn — about_Wildcards

본문

간단한 설명

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개와 매칭
    • ?nan, in, on과 매칭돼요
    • ?nran과는 매칭되지 않아요
  • ? — 파일·디렉터리에서 그 위치의 문자 0개 또는 1개와 매칭
    • ?.txta.txt, b.txt와 매칭돼요
    • ?.txtab.txt와는 매칭되지 않아요
  • [ ] — 문자의 범위(range)와 매칭
    • [a-l]ookbook, cook, look과 매칭돼요
    • [a-l]ooktook과는 매칭되지 않아요
  • [ ] — 특정 문자들과 매칭
    • [bc]ookbook, cook과 매칭돼요
    • [bc]ookhook과는 매칭되지 않아요
  • `* — 어떤 문자든 리터럴 문자(와일드카드가 아닌 그 문자 자체)로 매칭
    • 12`*412*4와 매칭돼요
    • 12`*41234와는 매칭되지 않아요

한 단어 패턴 안에 와일드카드 문자를 여러 개 넣을 수도 있어요. 예를 들어 a부터 l까지의 문자로 시작하는 텍스트 파일을 찾으려면 이렇게 하면 돼요:

Get-ChildItem C:\Techdocs\[a-l]*.txt

때로는 문자를 와일드카드로 취급하지 말고 그 문자 그대로 매칭하고 싶을 때가 있어요. 그럴 땐 백틱(`) 문자로 와일드카드 문자를 이스케이프하면, 그 문자를 리터럴 문자 값으로 비교해 줘요. 예를 들어 '*hello`?*'"hello?"를 포함하는 문자열과 매칭돼요.

많은 cmdlet이 파라미터 값에서 와일드카드 문자를 받아들여요. 각 cmdlet의 도움말 항목에 어떤 파라미터가 와일드카드를 받는지 나와 있어요. 와일드카드를 받는 파라미터는 대소문자를 구분하지 않아요.

와일드카드 문자는 명령어와 스크립트블록에서도 쓸 수 있는데, 예를 들어 속성 값을 나타내는 단어 패턴을 만들어 둘 수 있어요. 다음 명령어는 ServiceType 속성 값에 Interactive가 포함된 서비스를 가져와요:

Get-Service | Where-Object {$_.ServiceType -like "*Interactive*"}

다음 예시의 if 문은 와일드카드 문자로 속성 값을 찾는 조건을 만들어 써요. 복원 지점의 DescriptionPowerShell이 포함되어 있으면, 그 복원 지점의 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

더 알아보기