파일, 레지스트리 키, 인증서 또는 다른 PowerShell 드라이브 경로를 유효성 검사해야 하는 경우, Test-Path cmdlet이 필요합니다.
Test-Path cmdlet은 파일과 다른 항목의 많은 속성을 빠르게 확인하는 간단하면서도 유용한 방법입니다. 파일이 존재하는지(또는 다른 항목 유형), 문자열이 적절한 경로 형식인지, 또는 항목이 특정 시간보다 새로운지 또는 오래된지 여부까지 확인할 수 있습니다.
이 튜토리얼에서는 PowerShell Test-Path cmdlet에 대해 자세히 알아보고, PowerShell 스크립트를 개선하는 데 어떻게 사용할 수 있는지 알아보겠습니다.
사전 요구 사항
이 튜토리얼의 예제를 따라하려면 한 가지가 필요합니다; 바로 PowerShell입니다. 더 구체적으로는, 튜토리얼에서는 PowerShell v7.03을 Windows 10에서 사용하며, 배우게 될 많은 기법들은 이전 버전에도 적용됩니다.
Test-Path Cmdlet이 무엇을 하는가?
PowerShell Test-Path cmdlet은 가장 단순한 명령 중 하나입니다. 이는 PowerShell이 처음부터 존재하는 명령이며, 참(True) 또는 거짓(False) 두 가지 값만 반환합니다.
하지만, 그 단순함에 속지 마세요; 이것은 PowerShell 스크립트에서 정보를 검증하는 데 많은 시간을 절약해줄 것입니다.
PowerShell의 Test-Path cmdlet은 PowerShell 공급자와 드라이브와 함께 작업할 때 품질 관리 도구로 생각할 수 있습니다. 스크립트를 작성할 때, 일반적으로 PowerShell 드라이브에 포함된 다양한 항목과 작업을 수행할 것입니다. C:\, HKLM, Cert 등과 같은 PowerShell 드라이브를 사용할 것입니다.
Test-Path
는 모든 PS 드라이브와 함께 작동하지 않습니다. 예를 들어, 레지스트리 키에 대해Test-Path
를 사용하려고 하면 작동합니다. 그러나 레지스트리 값에 대해Test-Path
를 사용하면 항상False
를 반환합니다.
궁금하다면, 지금 바로 PowerShell에서 Get-PSDrive
cmdlet을 실행하고 표시되는 모든 PS 드라이브를 확인하세요.

이러한 드라이브에는 경로가 내부에 있습니다. 예를 들어, C:\Windows, HKLM:\Software 등이 있습니다. PowerShell 스크립트 내에서 경로를 사용할 때, 경로가 유효하거나 존재하는지 먼저 테스트하는 것이 좋은 습관입니다. 이것이 PowerShell의 Test-Path
의 역할입니다.
Test-Path
는 특정 조건이 충족되는지 여부(일반적으로 파일/폴더, 레지스트리 키, 인증서, 또는 변수의 존재 유무)에 따라 True
또는 False
를 반환하는 조건을 정의합니다.
Test-Path 매개변수 및 사용법
많은 다른 PowerShell cmdlet과 마찬가지로 Test-Path
cmdlet에는 동작을 변경하는 다양한 매개변수가 있습니다. 각 매개변수를 설명하고 어떻게 동작하며 어떤 종류의 결과를 기대할 수 있는지 살펴보겠습니다.
Path
Path
매개변수는 각 Test-Path
실행에 사용하는 필수 매개변수입니다. Path
매개변수는 존재 여부를 테스트하려는 PSDrive 경로를 정의합니다.
예를 들어, 폴더 C:\Foo의 존재 여부를 테스트하려면 Path
매개변수에 적절한 경로를 제공합니다. 그런 다음, C:\Foo가 실제로 존재하는지 여부에 따라 Test-Path
는 True
또는 False
를 반환합니다.
동일한 기술은 다른 항목 경로에도 사용할 수 있습니다. 아마도 레지스트리 키 HKLM:\Software\Foo의 존재 여부를 테스트하려고 할 수도 있습니다. 그 경우 Path
매개변수와 함께 레지스트리 키 경로를 사용하면 됩니다.
이 튜토리얼에서 설명하는 모든 기술은 모든 PowerShell 드라이브 경로에서 작동함을 알아두세요.
와일드카드 사용
경로가 리터럴 값을 가져야 하는 것이 아니라 경로가 특정 패턴과 일치하는지 여부만 확인하려는 경우 와일드카드를 Path
값에 사용할 수 있습니다.
예를 들어, C:\Foo 폴더에 Bar로 시작하는 하위 폴더가 있는지 확인하려고 할 수 있습니다. 그 경우 와일드카드를 사용할 수 있습니다.
위의 명령을 실행하면 Test-Path
가 Bar로 시작하는 어떤 폴더의 존재 여부를 확인하고 해당 조건과 일치하는 폴더가 있는지 여부에 따라 True
또는 False
를 반환합니다.
별표(*
)는 한 개 이상의 문자와 일치하며, 물음표(?
)를 사용하여 하나의 문자에 대해 더 상세하게 테스트할 수도 있습니다.
위의 시나리오를 예로 들면, 폴더 C:\Foo\Bar1이 존재하는 경우 아래 명령을 사용하여 Foo의 하위 폴더 중 Bar로 시작하고 정확히 네 개의 문자로 이루어진 어떤 하위 폴더인지 테스트할 수 있습니다.
경로 매개변수에 와일드카드를 사용하고 싶지만,
*
와 같은 와일드카드 문자를 명확하게 일치시키고 싶은 경우, 백틱(`)으로 와일드카드 문자를 이스케이프하여 언제든지 사용할 수 있습니다.
LiteralPath
LiteralPath
매개변수는 Path
매개변수와 거의 동일하지만, 와일드카드를 허용하지 않습니다. LiteralPath
를 사용하면 경로 값을 문자 그대로 해석합니다.
예를 들어, LiteralPath
를 사용하여 경로 값 내에 별표나 물음표를 사용하려고 하면, Test-Path
는 완전히 와일드카드 문자를 무시하고 아래 예제와 같이 C:\Foo\Bar?에 대해 문자 그대로 테스트합니다.
Test-Path
가 예상한 경로를 테스트하도록 와일드카드 문자를 사용하지 않아야 하는 경우, 기본 경로 매개변수로LiteralPath
를 사용해야 합니다.
PathType
기본적으로 Test-Path
를 실행하고 경로를 제공하면 해당 경로에서 무언가를 찾으면 True
를 반환합니다. 경로에는 파일 폴더, 레지스트리 키, 인증서 저장소 등과 같은 컨테이너 또는 파일, 레지스트리 값, 인증서와 같은 리프 항목이 포함될 수 있습니다.
Test-Path
를 사용하여 PathType
매개변수를 사용하여 컨테이너 또는 리프 항목에 대해 더 구체적으로 테스트할 수 있습니다.
기본적으로
Test-Path
는PathType
값으로Any
를 사용합니다.
예를 들어, C:\Foo\Bar에 폴더가 있고 해당 경로에서 파일을 찾으려는 경우 다음과 같이 PathType
매개변수를 사용할 수 있습니다. C:\Foo\Bar라는 이름의 파일이 존재하는지만 확인하려고 합니다.
대신에 C:\Foo\Bar가 실제로 파일인지 확인해야 하는 경우 컨테이너를 확인해야 합니다.
포함
Path
매개변수와 와일드카드를 사용하는 경우, 더 구체적으로 지정해야 할 때가 있습니다. 이 경우, Include
및 Exclude
매개변수를 살펴보아야 합니다.
다음과 같은 폴더가 있다고 가정해 보겠습니다:
- C:\Foo\Bar1
- C:\Foo\Bar2
- C:\Foo\Bar3
Bar로 시작하는 길이가 4인 폴더가 있는지 확인하려고 합니다. 예를 들어 Bar1, Bar2 등입니다.
위의 명령은 잘 작동하지만 이제 C:\Foo에 있는 Bar2라는 이름의 폴더만 찾고 싶습니다. 이 경우, Include
매개변수를 사용할 수 있습니다.
위의 명령은 이제 기본적으로 단일 폴더 C:\Foo\Bar2를 테스트합니다. 대신 Test-Path -Path 'C:\Foo\Bar2' -PathType Container
을 사용하는 것이 좋습니다.
제외
제외
매개변수는 포함
매개변수와 유사하게 작동하지만, 이번에는 일치하는 문자열을 제외합니다.
아마도 C:\Foo 폴더 안에 적어도 하나의 파일이 있는지 확인하려면 다음 명령을 사용할 수 있습니다:
위의 명령은 C:\Foo에 파일이 있는 경우 True
또는 False
를 반환합니다. 그러나 txt
확장자를 가진 파일을 제외한 다른 파일이 존재하는지 확인하려는 경우에는 Exclude
매개변수를 사용하여 txt
확장자를 가진 모든 파일을 테스트에서 제외할 수 있습니다.
필터
Microsoft의 문서에 따르면, 필터
매개변수는 “공급자의 형식 또는 언어 형식으로 필터를 지정합니다. 이 매개변수의 값은 경로
매개변수로 지정됩니다. 필터의 구문(와일드카드 문자 사용 포함)은 공급자에 따라 다릅니다”.
필터
매개변수는 일반적으로 Get-Childitem
과 같은 다른 cmdlet과 함께 사용해야 하지만, Test-Path
와 함께는 거의 사용되지 않습니다. 필터
매개변수를 잘 활용하는 방법을 찾았다면, Twitter에서 @adbertram으로 연락해주세요.
관련: Get-ChildItem: 파일, 레지스트리, 인증서 등을 한 번에 나열하기
NewerThan
파일의 타임스탬프를 확인하고 그에 따라 결정해야 할 때가 있었나요? 그렇다면 NewerThan
과 OlderThan
매개변수가 많은 코드를 절약해줍니다. NewerThan
매개변수는 항목의 타임스탬프가 특정 날짜보다 최신인지 확인합니다.
NewerThan
매개변수는 타임스탬프를 확인할 문자열이나 DateTime 개체를 받아들입니다. 예를 들어, 파일 C:\Foo\bar.txt가 2021년 1월 20일 이후에 생성되었는지 확인하려면 아래와 같이 Test-Path
를 실행합니다.
OlderThan
OlderThan
매개변수는 NewerThan
매개변수와 완전히 동일하지만 반대입니다. 이 매개변수는 항목이 특정 날짜보다 이전인지 확인합니다.
IsValid
스크립트에서 동적으로 경로를 구축한 적이 있다면 어려움을 알고 있을 겁니다. 때로는 키를 잘못 누르거나 경로에 특수 문자가 포함될 수도 있는데, 이 경우 IsValid
매개변수가 유용합니다.
IsValid
매개변수는 Test-Path
를 존재 여부를 확인하는 cmdlet이 아닌 경로 구문을 확인하는 cmdlet로 변경합니다. 이 매개변수는 경로가 유효한지에 대해서만 확인합니다.
예를 들어, 경로가 구문적으로 유효한지 확인해야 할 수도 있습니다. 몇 개의 변수와 연결하여 경로를 구성하는 작업을 수행하고 있습니다.
경로를 연결할 때는 항상
Join-Path
cmdlet을 사용하세요. 이것은 단지 예제를 위한 것입니다!
이제 동적으로 생성된 경로가 유효한지 확인하려면 아래와 같이 IsValid
매개변수를 사용하세요. Test-Path
가 False
를 반환하는 것을 확인할 수 있을 겁니다.
경로 abc:dffC:\
는 유효한 경로가 아니므로 이 상황에서 유효성 검사 루틴을 생성할 수 있습니다.
PowerShell v6.1.2 이전 버전을 사용하고
IsValid
및PathType
매개변수를 함께 사용하는 경우,Test-Path
는PathType
매개변수를 무시합니다.
자격 증명
Test-Path
에서 Credential
매개변수를 찾을 수 있지만, 다른 사용자로 PS 드라이브에 인증하는 데 사용할 수 있다고 생각할 수 있습니다. 이는 유효한 가정이지만 잘못된 것입니다.
안타깝게도, Test-Path
cmdlet에서 Credential
매개변수는 큰 역할을 하지 않습니다. Microsoft는 대체 자격 증명으로 Test-Path
를 호출하려면 Invoke-Command
cmdlet을 사용하고 거기에서 Credential
매개변수를 사용하는 것을 권장합니다.