파워셀 파일 존재 여부 유효성 검사: 포괄적인 가이드

파일을 생성, 읽기, 업데이트 및 삭제하기 위해 PowerShell을 사용합니까? 그렇다면, 대상 파일이 존재하지 않거나 이미 존재하는 경우 오류가 발생하는 경우가 있을 것입니다. 다행히도 PowerShell에서는 파일이 존재하는지 확인하기 전에 어떤 작업을 수행할 수 있는 방법이 있습니다.

예를 들어, 코드가 파일을 바로 생성하지 않고 파일이 이미 존재하는지 테스트하는 것이 좋습니다. 아래 스크린샷에서 보여지는 대로 더 나은 코드를 작성하고 명확한 출력을 얻을 수 있습니다.

Creating a file that already exists

이 문서에서는 파일이 존재하는지 확인하기 위해 PowerShell을 사용하는 다양한 방법을 배우게 됩니다. 또한 각각의 방법을 사용하여 오류 처리 로직과 함께 더 나은 코드와 결과물을 얻는 방법도 배우게 됩니다.

전제 조건

서비스 데스크 호출을 줄이고 VPN 외부에서도 원격 사용자의 캐시 자격 증명을 업데이트하려면 셀프 서비스 암호 재설정 솔루션을 사용하세요. Specops uReset의 데모를 받으세요!

이 문서는 여러 예제를 통해 학습할 수 있는 안내서입니다. 예제를 따라 하기 위해 다음이 필요합니다:

  • 코드 편집기. 권장하는 편집기는 Visual Studio CodeAtom입니다. 이 편집기들은 여러 플랫폼에서 작동합니다. Windows 컴퓨터에서 작업 중이라면 Windows PowerShell ISE를 사용할 수도 있습니다.
  • Windows PowerShell 5.1 (데스크톱) 또는 PowerShell 7.1 (코어). 이 문서의 명령어와 스크립트는 PowerShell 버전에 상관없이 적용됩니다. Windows, Linux 또는 macOS를 사용하더라도 PowerShell이 설치되어 있다면 사용할 수 있습니다.

관련 정보: Windows, Linux 및 macOS에 PowerShell 7 다운로드 및 설치하는 방법

파일의 존재 여부를 확인하기 위해 PowerShell 사용하기

이 문서에서는 PowerShell을 사용하여 파일이 존재하는지 확인하는 세 가지 방법을 다룹니다. 이 세 가지 방법은 사용법은 다르지만 개념과 최종 목표는 동일합니다. 이 세 가지 방법은 다음과 같습니다:

  • Test-Path Cmdlet.
  • Get-ItemGet-ChildItem Cmdlet.
  • System.IO.File 클래스.

각각의 세 가지 방법에 대한 예제와 데모, 그리고 오류 처리와 함께 사용하는 방법이 제공됩니다.

Test-Path 사용하기

첫 번째 방법은 특정 경로나 파일의 존재 여부를 확인하기 위해 설계된 Test-Path cmdlet입니다. 이 cmdlet을 사용하여 파일이 존재하는지 테스트할 때 결과는 true 또는 false입니다. 결과는 파일의 존재 여부를 나타냅니다.

아래는 Test-Path cmdlet을 사용하여 파일을 확인하는 기본 구문입니다.

Test-Path -Path <PATH to FILE> -PathType Leaf

예를 들어, C:\temp\important_file.txt라는 이름의 파일이 있는지 확인해야하는 경우 아래의 코드를 사용하십시오. -PathType Leaf 부분은 cmdlet에게 디렉토리가 아닌 파일을 확인하도록 지시합니다.

Test-Path -Path C:\temp\important_file.txt -PathType Leaf

PowerShell에서 위의 명령을 실행하면 파일이 존재하는 경우 결과는 True로 반환됩니다. 그렇지 않은 경우 결과는 아래 스크린샷에서 볼 수 있듯이 False입니다.

Using Test-Path in PowerShell to check if a file exists

관련 정보: PowerShell Test-Path Cmdlet 사용 방법

예제: 파일이 존재하지 않을 때 파일 생성하기

이 예제는 특정 위치에 파일을 생성하는 일반적인 사용 사례입니다. 스크립트는 파일을 생성하기 전에 파일이 이미 존재하는지 확인하여 “파일이 이미 존재합니다”라는 오류를 피합니다. 파일이 존재하는 경우 스크립트는 메시지를 표시하고 더 이상 파일을 생성하지 않습니다.

아래의 코드를 복사하여 Create-NewFile.ps1이라는 파일에 저장하십시오. 파일의 출력 위치를 변경하려면 $path 변수의 값을 변경하십시오. 스크립트를 저장한 후 PowerShell에서 실행하여 테스트하십시오.

# Create-NewFile.ps1

# 파일의 전체 경로
$file = 'c:\temp\important_file.txt'

# 파일이 존재하지 않으면 생성합니다.
if (-not(Test-Path -Path $file -PathType Leaf)) {
     try {
         $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
         Write-Host "The file [$file] has been created."
     }
     catch {
         throw $_.Exception.Message
     }
 }
# 파일이 이미 존재하는 경우 메시지를 표시하고 아무 작업도 수행하지 않습니다.
 else {
     Write-Host "Cannot create [$file] because a file with that name already exists."
 }

아래 스크린샷은 두 가지 다른 출력을 보여줍니다. 첫 번째는 파일이 존재하지 않을 때 스크립트를 실행한 결과입니다. 두 번째는 파일을 생성한 후에 이미 존재하는 경우입니다.

Running the PowerShell script to create a file

관련 기사: 기본으로 돌아가기: PowerShell 스크립트 실행 방법

Get-Item 및 Get-ChildItem 사용

Get-Item cmdlet의 목적은 지정된 위치의 항목 가져오기입니다. 비교적으로 Get-ChildItem cmdlet은 하나 이상의 지정된 위치에서 항목과 하위 항목 가져오기를 위한 것입니다. 이 두 가지 cmdlet의 기능은 명시적으로 파일의 존재 여부를 확인하는 것이 아닙니다.

Get-Item 또는 Get-ChildItem을 사용하여 존재하지 않는 항목을 가져오면 어떻게 될까요? 각 누락된 파일에 대해 오류가 발생합니다. 다음 명령을 예로 들어보겠습니다.

$file = 'c:\temp\important_file.txt'
Get-Item -Path $file
Get-ChildItem -Path $file

파일 c:\temp\important_file.txt이 존재하지 않는다고 가정해 봅시다. 위의 각 명령은 오류를 반환합니다. 아래 예시에서 확인할 수 있듯이, 두 명령에 대한 오류 메시지는 동일합니다.

Using Get-Item and Get-ChildItem in PowerShell to check if a file exists

예시: 기존 파일 보관 및 새 파일 생성

이 예시에서 스크립트는 Get-ItemTest-Path cmdlet을 사용합니다. 이 스크립트의 논리는 다음과 같습니다:

  • Test-Path를 사용하여 아카이브 폴더가 있는지 테스트합니다.
    • 아카이브 폴더가 없으면 스크립트는 yyyy-MMM-dd_hh-mm-ss-tt 형식으로 새로운 아카이브 폴더를 생성합니다.
    • 그런 다음, 스크립트는 이전 파일을 아카이브 폴더로 이동시킵니다.
  • Get-Item을 사용하여 파일이 이미 있는지 테스트합니다.
    • 파일이 있는 경우, 스크립트는 먼저 해당 파일을 아카이브 폴더로 이동시킵니다. 그런 다음 원래 위치에 새 파일을 생성합니다.
    • 파일이 없는 경우, 스크립트는 새로운 파일을 생성합니다.

아래의 코드를 복사하여 Create-NewFileAfterArchive.ps1로 저장하십시오. 스크립트를 저장한 후 PowerShell에서 실행하여 결과를 확인하십시오.

# Create-NewFileAfterArchive.ps1

# 파일의 전체 경로
$file = 'c:\temp\important_file.txt'

# 아카이브 폴더의 전체 경로
$archiveFolder = "c:\temp\archive_$(get-date -Format 'yyyy-MMM-dd_hh-mm-ss-tt')\"

# 파일이 존재하면 아카이브 폴더로 이동한 후 새 파일을 생성합니다.
if (Get-Item -Path $file -ErrorAction Ignore) {
    try {
        ## 아카이브 폴더가 존재하지 않으면 새로 만듭니다.
        if (-not(Test-Path -Path $archiveFolder -PathType Container)) {
            $null = New-Item -ItemType Directory -Path $archiveFolder -ErrorAction STOP
        }
        ## 기존 파일을 아카이브로 이동합니다.
        Move-Item -Path $file -Destination $archiveFolder -Force -ErrorAction STOP
        Write-Host "The old file [$file] has been archived to [$archiveFolder]"
     } catch {
        throw $_.Exception.Message
     }
 }
 Create the new file
 try {
     $null = New-Item -ItemType File -Path $file -Force -ErrorAction Stop
     Write-Host "The new file [$file] has been created."
 } catch {
    Write-Host $_.Exception.Message
 }

팁: -ErrorAction Ignore 매개변수는 오류를 억제합니다(콘솔에 표시되지 않음) 및 오류를 $error 자동 변수에 기록하지 않습니다.

아래 스크린샷에서 첫 번째 스크립트 실행은 c:\temp\important_file.txt 파일을 생성했습니다. 이후의 스크립트 실행은 매번 새 아카이브 폴더를 생성하고, 기존 파일을 아카이브 폴더로 이동한 후 c:\temp\important_file.txt에 새 파일을 생성합니다.

Running a script in PowerShell to check if a file exists using Get-Item

[System.IO.File]::Exists() .NET 메소드 사용하기

이 문서에서 학습할 마지막 방법은 System.IO.File .NET 클래스의 Exists() 메소드입니다. PowerShell의 장점 중 하나는 .NET 클래스와 메소드를 가져와 사용할 수 있는 능력입니다.

예를 들어, PowerShell에서 Exists() 메소드를 사용하여 파일이 존재하는지 확인하려면 아래 코드를 사용합니다.

[System.IO.File]::Exists("PATH")

위의 방법은 부울 결과를 생성합니다 – true 또는 false. 결과가 true로 반환되면 대상 파일이 존재하는 것을 의미합니다. 그렇지 않으면 대상 파일이 존재하지 않을 때 결과는 false로 반환됩니다.

아래 예시 코드에서는 파일 c:\temp\important_file.txt의 존재 여부를 확인합니다.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file)

아래 결과에서 볼 수 있듯이, 결과는 true를 반환하여 파일이 존재함을 확인합니다.

Using System.IO.File class in PowerShell

이 .NET 방법을 사용하면 다음과 같은 삼항 연산자를 사용할 수도 있습니다. 기본적인 true 또는 false 결과를 표시하는 대신, 더 짧은 구현으로 결과 메시지를 사용자 정의할 수 있습니다. 그러나 이 예시에서의 삼항 연산자는 PowerShell 7+에서만 적용됩니다.

$file = 'c:\temp\important_file.txt'
[System.IO.File]::Exists($file) ? "The file exists." : "The file does not exist."

예시: 파일이 존재하는 경우 파일 내용 업데이트

이 예시 스크립트는 텍스트 파일에 새로운 GUID 값을 추가하여 파일을 업데이트합니다. 그러나 파일이 존재하는 경우에만 내용 업데이트가 발생합니다. 그렇지 않으면 스크립트는 메시지를 표시하고 아무 작업도 수행하지 않습니다.

아래 스크립트를 복사하고 Update-FileContents.ps1로 저장하십시오. 필요한 경우 $file 변수의 파일 경로 값을 변경한 다음 PowerShell에서 스크립트를 실행하여 테스트하십시오.

# Update-FileContents.ps1

#파일의 전체 경로
$file = 'c:\temp\important_file.txt'

# 파일이 존재하는 경우 파일에 새로운 GUID 값을 추가합니다.
if ([System.IO.File]::Exists($file)) {
    try {
        $newValue = ((New-Guid).Guid)
        Add-Content -Path $file -Value $newValue -ErrorAction STOP
        Write-Host "The file [$file] has been updated with [$newValue]"
     } catch {
        throw $_.Exception.Message
     }    
 }

# 파일이 존재하지 않는 경우 메시지를 표시하고 아무 작업도 수행하지 않습니다.
 else {
     Write-Host "The file [$file] could not be updated because it does not exist."
 }

아래 스크린샷에서 볼 수 있듯이 스크립트가 실행될 때마다 파일이 업데이트되었습니다. 업데이트가 발생한 이유는 [System.IO.File]::Exists() 메서드가 파일 c:\temp\important_file.txt가 존재함을 확인했기 때문입니다.

최종적으로 명령어 gc c:\temp\important_file.txt를 사용하여 파일의 내용을 읽으면 스크립트가 GUID 값을 사용하여 파일을 업데이트했음을 확인할 수 있습니다.

Using [System.IO.File]::Exists() .NET Method in PowerShell

관련 정보: PowerShell 데이터 유형 가속기를 사용하여 코딩 속도 향상하기

결론

서비스 데스크 호출을 줄이고 VPN 없이 원격 사용자의 캐시 자격 증명을 업데이트하는 자체 서비스 암호 재설정 솔루션입니다. Specops uReset의 데모를 받으세요!

이 글에서는 파일의 존재 여부를 확인하기 위해 PowerShell을 사용하는 여러 가지 방법을 알아보았습니다. 파일과 관련된 수정 작업을 수행하기 전에 파일의 존재 여부를 확인하는 것이 좋은 관행입니다.

당신은 Get-Item, Get-ChildItem, 그리고 Test-Path cmdlet을 사용하는 방법에 대해 배웠습니다. 또한 [System.IO.File]::Exists() .NET 메소드에 대해서도 알게 되었습니다. 이 예제들은 기술을 사용하는 방법과 에러 처리 로직과의 결합을 보여주었습니다.

더 이상 그 에러 메시지들을 견딜 필요가 없습니다. 파일 관련 작업을 수행하기 전에 파일이 존재하는지 확인하는 코드를 추가하여 그 에러들을 극복하세요. 여기서 배운 기술들은 기본에 대해서만 다루었으며, 이제 당신은 그것들을 개선할 차례입니다.

Source:
https://adamtheautomator.com/powershell-check-if-file-exists/