Форматирование строк в PowerShell: Освоение основ

Тип строки, вероятно, является самой популярной переменной в PowerShell. Не думаю, что я когда-либо писал скрипт, в котором не было бы хотя бы одной строки. Строки отлично подходят для определения простого набора символов, как имя компьютера, путь к текстовому файлу, путь к ключу реестра, URL и так далее. Расширяя переменные внутри строк и используя возможности форматирования строк PowerShell, вы можете делать практически что угодно.

Строки определяются путем заключения одного или нескольких символов в одинарные или двойные кавычки, как:

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

Определение строк таким образом просто, но вскоре вы обнаружите, что вам нужно получить значение переменной внутри строк.

Например, возможно, у вас есть скрипт с параметром ComputerName и в вашем скрипте вам нужно конкатенировать стандартный префикс к нему, как SRV-, как показано ниже.

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

Теперь значение переменной $ComputerNameSRV-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: Поиск строки внутри строки и Переменные PowerShell в строках.

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