Главная > Powershell > Использование оператора –f в Powershell

Использование оператора –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р.
Рубрики:Powershell Метки: ,
  1. Scripter
    19/05/2013 в 21:26

    Так вот оно что! Мне как раз как начинающему скриптописателю было непонятно все эти {0:N2}, {1:P3}. На самом деле действительно все оказывается просто )) Большое спасибо! ) А можно заодно вопрос как Вы определяете какая команда выполняется быстрее? У меня по-моему они одинаково быстро выполняются )

    • 20/05/2013 в 09:25

      Есть такой командлет — Measure-Command. Скармливаете ему свою команду, он покажет сколько времени она выполняется. Подробнее: Get-Help Measure-Command.

  2. esqado
    13/08/2013 в 19:01

    Наткнулся случайно — думал об этом достаточно давно. Спасибо за ясность. Уберу в блокнотик.

  3. 19/09/2019 в 19:54

    Спасибо автору материала! Много нужного у Вас в блоге. Добавила в ридер теперь буду чаще посещать.

  1. 24/09/2013 в 10:49
  2. 27/09/2017 в 10:47

Ответить на esqado Отменить ответ