PowerShell Test-Path Cmdlet: 파일, 키 등 확인

파일, 레지스트리 키, 인증서 또는 다른 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 드라이브를 확인하세요.

PS Drives after running Get-PSDrive

이러한 드라이브에는 경로가 내부에 있습니다. 예를 들어, 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-PathTrue 또는 False를 반환합니다.

PS> Test-Path -Path 'C:\Foo'
True

동일한 기술은 다른 항목 경로에도 사용할 수 있습니다. 아마도 레지스트리 키 HKLM:\Software\Foo의 존재 여부를 테스트하려고 할 수도 있습니다. 그 경우 Path 매개변수와 함께 레지스트리 키 경로를 사용하면 됩니다.

PS> Test-Path -Path 'HKLM:\Software\Foo'
True

이 튜토리얼에서 설명하는 모든 기술은 모든 PowerShell 드라이브 경로에서 작동함을 알아두세요.

와일드카드 사용

경로가 리터럴 값을 가져야 하는 것이 아니라 경로가 특정 패턴과 일치하는지 여부만 확인하려는 경우 와일드카드를 Path 값에 사용할 수 있습니다.

예를 들어, C:\Foo 폴더에 Bar로 시작하는 하위 폴더가 있는지 확인하려고 할 수 있습니다. 그 경우 와일드카드를 사용할 수 있습니다.

PS> Test-Path -Path 'C:\Foo\Bar*'

위의 명령을 실행하면 Test-PathBar로 시작하는 어떤 폴더의 존재 여부를 확인하고 해당 조건과 일치하는 폴더가 있는지 여부에 따라 True 또는 False를 반환합니다.

별표(*)는 한 개 이상의 문자와 일치하며, 물음표(?)를 사용하여 하나의 문자에 대해 더 상세하게 테스트할 수도 있습니다.

위의 시나리오를 예로 들면, 폴더 C:\Foo\Bar1이 존재하는 경우 아래 명령을 사용하여 Foo의 하위 폴더 중 Bar로 시작하고 정확히 네 개의 문자로 이루어진 어떤 하위 폴더인지 테스트할 수 있습니다.

PS> Test-Path -Path 'C:\Foo\Bar?'

경로 매개변수에 와일드카드를 사용하고 싶지만, *와 같은 와일드카드 문자를 명확하게 일치시키고 싶은 경우, 백틱(`)으로 와일드카드 문자를 이스케이프하여 언제든지 사용할 수 있습니다.

LiteralPath

LiteralPath 매개변수는 Path 매개변수와 거의 동일하지만, 와일드카드를 허용하지 않습니다. LiteralPath를 사용하면 경로 값을 문자 그대로 해석합니다.

예를 들어, LiteralPath를 사용하여 경로 값 내에 별표나 물음표를 사용하려고 하면, Test-Path는 완전히 와일드카드 문자를 무시하고 아래 예제와 같이 C:\Foo\Bar?에 대해 문자 그대로 테스트합니다.

PS> Test-Path -LiteralPath 'C:\Foo\Bar?'

Test-Path가 예상한 경로를 테스트하도록 와일드카드 문자를 사용하지 않아야 하는 경우, 기본 경로 매개변수로 LiteralPath를 사용해야 합니다.

PathType

기본적으로 Test-Path를 실행하고 경로를 제공하면 해당 경로에서 무언가를 찾으면 True를 반환합니다. 경로에는 파일 폴더, 레지스트리 키, 인증서 저장소 등과 같은 컨테이너 또는 파일, 레지스트리 값, 인증서와 같은 리프 항목이 포함될 수 있습니다.

Test-Path를 사용하여 PathType 매개변수를 사용하여 컨테이너 또는 리프 항목에 대해 더 구체적으로 테스트할 수 있습니다.

기본적으로 Test-PathPathType 값으로 Any를 사용합니다.

예를 들어, C:\Foo\Bar에 폴더가 있고 해당 경로에서 파일을 찾으려는 경우 다음과 같이 PathType 매개변수를 사용할 수 있습니다. C:\Foo\Bar라는 이름의 파일이 존재하는지만 확인하려고 합니다.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Leaf

대신에 C:\Foo\Bar가 실제로 파일인지 확인해야 하는 경우 컨테이너를 확인해야 합니다.

PS> Test-Path -LiteralPath 'C:\Foo\Bar' -PathType Container

포함

Path 매개변수와 와일드카드를 사용하는 경우, 더 구체적으로 지정해야 할 때가 있습니다. 이 경우, IncludeExclude 매개변수를 살펴보아야 합니다.

다음과 같은 폴더가 있다고 가정해 보겠습니다:

  • C:\Foo\Bar1
  • C:\Foo\Bar2
  • C:\Foo\Bar3

Bar로 시작하는 길이가 4인 폴더가 있는지 확인하려고 합니다. 예를 들어 Bar1, Bar2 등입니다.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container

위의 명령은 잘 작동하지만 이제 C:\Foo에 있는 Bar2라는 이름의 폴더만 찾고 싶습니다. 이 경우, Include 매개변수를 사용할 수 있습니다.

PS> Test-Path -Path C:\Foo\Bar? -PathType Container -Include 'Bar2'

위의 명령은 이제 기본적으로 단일 폴더 C:\Foo\Bar2를 테스트합니다. 대신 Test-Path -Path 'C:\Foo\Bar2' -PathType Container을 사용하는 것이 좋습니다.

제외

제외 매개변수는 포함 매개변수와 유사하게 작동하지만, 이번에는 일치하는 문자열을 제외합니다.

아마도 C:\Foo 폴더 안에 적어도 하나의 파일이 있는지 확인하려면 다음 명령을 사용할 수 있습니다:

PS> Test-Path -Path C:\Foo\* -PathType Leaf

위의 명령은 C:\Foo에 파일이 있는 경우 True 또는 False를 반환합니다. 그러나 txt 확장자를 가진 파일을 제외한 다른 파일이 존재하는지 확인하려는 경우에는 Exclude 매개변수를 사용하여 txt 확장자를 가진 모든 파일을 테스트에서 제외할 수 있습니다.

PS> Test-Path -Path C:\Foo\* -PathType Leaf -Exclude *.txt

필터

Microsoft의 문서에 따르면, 필터 매개변수는 “공급자의 형식 또는 언어 형식으로 필터를 지정합니다. 이 매개변수의 값은 경로 매개변수로 지정됩니다. 필터의 구문(와일드카드 문자 사용 포함)은 공급자에 따라 다릅니다”.

필터 매개변수는 일반적으로 Get-Childitem과 같은 다른 cmdlet과 함께 사용해야 하지만, Test-Path와 함께는 거의 사용되지 않습니다. 필터 매개변수를 잘 활용하는 방법을 찾았다면, Twitter에서 @adbertram으로 연락해주세요.

관련: Get-ChildItem: 파일, 레지스트리, 인증서 등을 한 번에 나열하기

NewerThan

파일의 타임스탬프를 확인하고 그에 따라 결정해야 할 때가 있었나요? 그렇다면 NewerThanOlderThan 매개변수가 많은 코드를 절약해줍니다. NewerThan 매개변수는 항목의 타임스탬프가 특정 날짜보다 최신인지 확인합니다.

NewerThan 매개변수는 타임스탬프를 확인할 문자열이나 DateTime 개체를 받아들입니다. 예를 들어, 파일 C:\Foo\bar.txt가 2021년 1월 20일 이후에 생성되었는지 확인하려면 아래와 같이 Test-Path를 실행합니다.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan 'January 20, 2021'
## 또는
Test-Path -LiteralPath 'C:\Foo\bar.txt' -NewerThan '1/20/21'

OlderThan

OlderThan 매개변수는 NewerThan 매개변수와 완전히 동일하지만 반대입니다. 이 매개변수는 항목이 특정 날짜보다 이전인지 확인합니다.

Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan 'January 20, 2021'
## 또는
Test-Path -LiteralPath 'C:\Foo\bar.txt' -OlderThan '1/20/21'

IsValid

스크립트에서 동적으로 경로를 구축한 적이 있다면 어려움을 알고 있을 겁니다. 때로는 키를 잘못 누르거나 경로에 특수 문자가 포함될 수도 있는데, 이 경우 IsValid 매개변수가 유용합니다.

IsValid 매개변수는 Test-Path를 존재 여부를 확인하는 cmdlet이 아닌 경로 구문을 확인하는 cmdlet로 변경합니다. 이 매개변수는 경로가 유효한지에 대해서만 확인합니다.

예를 들어, 경로가 구문적으로 유효한지 확인해야 할 수도 있습니다. 몇 개의 변수와 연결하여 경로를 구성하는 작업을 수행하고 있습니다.

경로를 연결할 때는 항상 Join-Path cmdlet을 사용하세요. 이것은 단지 예제를 위한 것입니다!

$someVar = 'abc:dff'
$rootPath = 'C:\'
$path = "$someVar$rootPath

이제 동적으로 생성된 경로가 유효한지 확인하려면 아래와 같이 IsValid 매개변수를 사용하세요. Test-PathFalse를 반환하는 것을 확인할 수 있을 겁니다.

PS> Test-Path -LiteralPath $path -IsValid
False

경로 abc:dffC:\는 유효한 경로가 아니므로 이 상황에서 유효성 검사 루틴을 생성할 수 있습니다.

PowerShell v6.1.2 이전 버전을 사용하고 IsValidPathType 매개변수를 함께 사용하는 경우, Test-PathPathType 매개변수를 무시합니다.

자격 증명

Test-Path에서 Credential 매개변수를 찾을 수 있지만, 다른 사용자로 PS 드라이브에 인증하는 데 사용할 수 있다고 생각할 수 있습니다. 이는 유효한 가정이지만 잘못된 것입니다.

안타깝게도, Test-Path cmdlet에서 Credential 매개변수는 큰 역할을 하지 않습니다. Microsoft는 대체 자격 증명으로 Test-Path를 호출하려면 Invoke-Command cmdlet을 사용하고 거기에서 Credential 매개변수를 사용하는 것을 권장합니다.

Invoke-Command -Credential (Get-Credential) -Scriptblock {Test-Path -LiteralPath 'C:\'}

관련: Invoke-Command: 원격 코드 실행의 최상의 방법

Source:
https://adamtheautomator.com/powershell-test-path/