Использование оператора –f в Powershell
Обнаружил в черновиках неопубликованную статью. Немного обновив решил выложить, думаю пригодится ещё…
В Powershell есть замечательный оператор –f, который позволяет форматировать строки используя метод format .NET объекта string, что позволяет гибко настраивать отображение выводимых объектов, однако у начинающих скриптописателей его использование может вызвать затруднения в связи с запутанностью синтаксиса. Попробуем разобраться что и как…
В русской справке к Powershell про оператор –f написано буквально следующее:
Оператор форматирования f форматирует строки с помощью метода форматирования строковых объектов. Строка формата указывается слева от оператора, а форматируемые объекты – справа от него.
Другими словами слева от оператора в кавычках указывается строка, определяющая формат, а справа – набор объектов, которые нужно вывести. Строка, определяющая формат состоит из отображаемого текста и индексов объектов, которые будут выводиться. Можно обойтись и без текста, а задать только порядок выводимых элементов. Идентификатор элемента задаётся в фигурных скобках (начинаются как обычно с нуля). Выходная строка содержит текст (если был указан) и строковую интерпретацию объектов.
В общем случае это выглядит так:
‘порядок’ –f объекты
Например:
PS C:\> '{0} {1}' -f "раз", "два" раз два PS C:\> '{1} {0}' -f "раз", "два" два раз
Для чего это может быть полезно? Например, есть какие-то данные:
$Name = 'Вася' $Surname = 'Иванов'
Нужно вывести их подставив в строку. В обычном виде это будет выглядеть так:
'Меня зовут ' + $Name + ', а фамилия моя ' + $Surname
Используя оператор –f для вывода этой же строки достаточно записать:
'Меня зовут {0}, а фамилия моя {1}' -f $Name, $Surname
Результат будет один и тот же.
На первый взгляд первый вариант кажется компактнее, однако в этом случае нужно во время набора строки представлять как она будет выглядеть при выводе, учитывая пробелы и прочее форматирование, по ходу дела расставляя плюсы. Во втором же случае всё намного проще, я вообще обычно сначала пишу пустые кавычки, –f, нужные объекты, а потом возвращаюсь в кавычки и уже в них делаю строку на вывод подставляя индексы объектов. Кроме того в таком виде команда выполняется в разы быстрее.
Но это далеко не всё…
Спецификаторы формата
Используя оператор –f объекты можно представлять в разных форматах. Формат задаётся спецификатором (или определителем) формата.
Все доступные спецификаторы можно посмотреть в MSDN. По моему мнению самыми распространёнными форматами являются:
-
Денежный (C)
-
С фиксированной точкой (F)
-
Общий (наиболее компактный) (G)
-
Числовой (с разделителями) (N)
-
Процентный (P)
-
Шестнадцатеричный (X)
-
Десятичный (D)
-
Научный (экспоненциальный) (E)
Буквы в скобках обозначают символ спецификатора.
При использовании спецификатора его символ указывается после индекса объекта через двоеточие. Например:
PS C:\> '{0:C}' -f 15 15,00р.
Практически для всех форматов можно задать задать число разрядов после запятой. Это делается приписыванием соответствующей цифры сразу после спецификатора:
PS C:\> '{0:E}' -f 15 1,500000E+001 PS C:\> '{0:E3}' -f 15 1,500E+001 PS C:\> '{0:F}' -f 46 46,00 PS C:\> '{0:F5}' -f 46 46,00000 PS C:\> '{0:N}' -f 1236789 1 236 789,00 PS C:\> '{0:N6}' -f 1236789 1 236 789,000000
По умолчанию отображается два знака после запятой, если запятую и нули после неё нужно убрать, можно указать число выводимых знаков после запятой равным нулю:
PS C:\> '{0:N0}' -f 1236789 1 236 789
Таким же нехитрым способом можно округлять числа до нужной точности:
PS C:\> '{0:N1}' -f 23.65456 23,7
Работа с процентами
Процентный формат позволяет представлять числа в виде процентов:
PS C:\> '{0:P}' -f 0.25 25,00%
Таким способ очень удобно переводить числа в проценты. Например, если нужно выяснить сколько процентов составляет 0,5 от 1 достаточно выполнить:
PS C:\> '{0:P0}' -f (0.5/1) 50%
Таким же образом можно легко оперировать с различными величинами в различных системах. Например, чтобы узнать сколько процентов составляет 500 МБ от 8 ГБ не нужно их приводить к МБ или ГБ:
PS C:\> '{0:P}' -f (500MB/8GB) 6,10%
Работа с шестнадцатеричной системой счисления
Похожим образом можно легко переводить числа в в шестнадцатеричную систему счисления:
PS C:\> '{0:X}, {1:X}' -f 10, 12 A, C
И обратно:
PS C:\> '{0:D}' -f 0xA 10
Отображение дат с помощью оператора -f
Аналогичным образом можно выводить дату и части дат (объект DateTime), с той лишь разницей, что в данном случае используются другие определители формата. Не буду расписывать возможные определители, все они описаны в MSDN. Например:
PS C:\> '{0:yyyy}' -f (Get-Date) 2013 PS C:\> '{0:t}' -f (Get-Date) 15:09 PS C:\> '{0:T}' -f (Get-Date) 15:10:33 PS C:\> '{0:MM}' -f (Get-Date) 05 (месяц) PS C:\> '{0:mm}' -f (Get-Date) 11 (минуты)
и т.д.
Можно даже перевести время в деньги 🙂
PS C:\> '{0:C}' -f (Get-Date).Hour 15,00р.
Так вот оно что! Мне как раз как начинающему скриптописателю было непонятно все эти {0:N2}, {1:P3}. На самом деле действительно все оказывается просто )) Большое спасибо! ) А можно заодно вопрос как Вы определяете какая команда выполняется быстрее? У меня по-моему они одинаково быстро выполняются )
Есть такой командлет — Measure-Command. Скармливаете ему свою команду, он покажет сколько времени она выполняется. Подробнее: Get-Help Measure-Command.
Наткнулся случайно — думал об этом достаточно давно. Спасибо за ясность. Уберу в блокнотик.
Пожалуйста 🙂
Спасибо автору материала! Много нужного у Вас в блоге. Добавила в ридер теперь буду чаще посещать.