PowerShell 문자열 포맷팅: 기본 기술 마스터하기

문자열(string) 타입은 아마도 PowerShell에서 가장 인기 있는 변수일 것입니다. 내가 작성한 스크립트 중에 적어도 하나의 문자열이 포함되지 않은 것 같지 않습니다. 문자열은 컴퓨터 이름, 텍스트 파일 경로, 레지스트리 키 경로, URL 등과 같이 간단한 문자 집합을 정의하는 데 훌륭합니다. 문자열 내부에 변수를 확장하고 PowerShell의 문자열 형식 기능을 사용하면 거의 모든 작업을 수행할 수 있습니다.

문자열은 다음과 같이 하나 이상의 문자를 작은 따옴표 또는 큰 따옴표로 묶어 정의됩니다:

$Url = 'http:\\www.bing.com'
$FilePath = 'C:\thisissomefile.txt'

이러한 방식으로 문자열을 정의하는 것은 간단하지만 곧 변수의 값이 문자열 내부에 필요한 경우가 생길 것입니다.

예를 들어, 아마도 ComputerName 매개변수가 있는 스크립트가 있고 스크립트에서 아래와 같이 표준 접두사를 연결해야 하는 경우가 있을 수 있습니다.SRV-

$ComputerName = 'URANUS'
$ComputerName = "SRV-$ComputerName"

이제 $ComputerName 변수의 값은 SRV-URANUS입니다. 그러나 이중 따옴표 안에 $ComputerName을 둘러싸는 것은 문자열에 변수를 삽입하는 한 가지 방법일 뿐입니다. 이를 수행하는 몇 가지 다른 방법이 있습니다. 두 가지 예제를 살펴보겠습니다.

문자열 확장

첫 번째 방법은 아마 이미 알고 있는 확장 문자열 또는 기존 문자열 내부의 변수를 확장하는 것입니다. 이것은 변수의 값을 문자열에 표시하는 가장 일반적인 방법입니다.

이를 위해서는 변수를 이중 따옴표로 묶인 문자열 내에 배치해야 합니다. 작은 따옴표는 모든 문자를 문자 그대로 처리하므로 작동하지 않습니다.

예를 들어, 파일 경로를 지정해야 할 수도 있습니다. 기본 폴더 경로는 알지만 실제 파일 이름은 아직 알지 못합니다. 변수 $FullPath를 만들어 폴더 경로를 정적으로 입력할 수 있지만 파일 이름은 변수로 만들 수 있습니다.

PS> $FileName = 'MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$FileName"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

문자열 내에서 객체 속성을 지정해야 할 경우 다소 다르게 보입니다. 이 경우 속성을 괄호로 둘러싸고 앞에 달러 기호를 붙여야 합니다. 이를 서브 표현식 연산자라고 합니다. 이는 PowerShell에 값을 먼저 확장하도록 알려줍니다.

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $FullPath = "C:\Folder\subfolder\$($File.Name)"
PS> $FullPath
C:\Folder\subfolder\MyFile.txt

문자열 확장은 매우 일반적이지만 더 복잡한 문자열이 있는 경우 어떻게 해야 할까요?

PowerShell 문자열 형식 연산자 사용

문자열에 변수 값이 삽입되도록 보장하는 또 다른 방법은 PowerShell의 형식 연산자(-f)를 통한 것입니다.

형식 연산자를 사용하면 변수나 속성을 이중 따옴표로 둘러싼 문자열 내에 배치할 필요가 없습니다. 아래에 표시된 대로 문자열을 단일 따옴표로 만들고 해당 문자열에 들어갈 변수를 외부에서 지정할 수 있습니다.

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> 'C:\Folder\subfolder\{0}' -f $File.Name
C:\Folder\subfolder\MyFile.txt

동일한 효과를 볼 수 있습니다. 이번에는 이중 따옴표를 사용할 필요가 없으며 속성을 괄호로 둘러싸고 또 다른 달러 기호로 감싸는 것을 걱정할 필요가 없습니다. 조금 더 깔끔해 보이지만 이해하기 어려울 수 있습니다. 형식 연산자를 사용하면 {0}$File.Name으로 바꿔야 한다는 것을 머릿속에서 생각하게 됩니다.

다른 변수를 추가하려면 간단히 레이블을 1씩 증가시키고 형식 연산자에 쉼표로 구분된 다른 변수를 계속 추가하면 됩니다. 형식 연산자의 인덱스 위치가 문자열 레이블의 위치와 일치하면 참조를 원하는 만큼 추가할 수 있습니다.

PS> $File = Get-Item -Path 'C:\MyFile.txt'
PS> $SubFolderName = 'folder1'
PS> 'C:\Folder\subfolder\{0}\{1}' -f $SubFolderName, $File.Name
C:\Folder\subfolder\folder1\MyFile.txt

형식 연산자 사용 시기

I usually prefer to place variables inside of the string and expand them because I don’t have to match an index with a value. However, there are exceptions, as in the case of special characters that must be escaped.

예를 들어, 파일 이름을 전달해야 하는 명령줄 유틸리티를 실행해야 하는 경우를 생각해 보겠습니다. 이 파일 경로에는 공백이 포함될 수 있으므로 해당 참조를 이중 따옴표로 묶어야 합니다. 이중 따옴표가 없으면 유틸리티.exe가 파일 인수를 올바르게 해석할 수 없습니다.

Utility.exe -file "C:\Program Files\SomeFolder\a subfolder here"

이제 PowerShell 스크립트에서 이 작업을 수행하려고 합니다. 확장 문자열을 사용하는 경우에는 이중 따옴표를 이스케이프하기 위해 백틱을 사용해야 하므로 조금 지저분해 보일 것입니다.

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
Start-Process -FilePath 'utility.exe' -Args "`"$FileName`""

이제 형식 연산자를 사용하여 동일한 결과를 얻어 보겠습니다.

$FileName = 'C:\Program Files\SomeFolder\a subfolder here'
$Args = '"{0}"' -f $FileName
Start-Process -FilePath 'utility.exe' -Args $Args

I don’t have to use any escape characters. This may seem like a simple example but as soon as you come across large strings that require a lot of escaping you will soon see the real benefit of using the format operator!

요약

문자열 내에서 변수를 대체해야 할 때 다음 번에는 가장 읽기 쉬운 방법을 생각해 보세요. 장기적으로 시간을 절약할 수 있습니다.

문자열 작업 관련 더 많은 게시물을 보려면 PowerShell Substring: 문자열 내에서 문자열 찾기문자열 내 PowerShell 변수을 확인하세요.

Source:
https://adamtheautomator.com/powershell-string-format/