Обычно для форматирования вывода в PowerShell используются командлеты типа Format-* (Format-Table, Format-List и т.п.). Однако сегодня речь пойдет не о них, а о ″маленьком но гордом″ операторе форматирования -f.
Оператор -f реализован с помощью .Net метода format объекта string. Синтаксис у него простой, хотя и несколько необычный: слева от оператора, в кавычках, указывается строка с индексами объектов, справа — сами объекты, разделенные запятой. Индексы размещаются в фигурных скобках, счет идет с нуля.
С помощью индексов определяется порядок вывода объектов, например так получим все объекты в прямом порядке:
″{0} {1} {2}″ -f ″раз″,″два″,″три″
а так в обратном:
″{2} {1} {0}″ -f ″раз″,″два″,″три″
Примечание. Если вы предпочитаете стиль .Net, то предыдущий пример можно записать так:
[string]::Format(″{0} {1} {2}″,′раз′,′два′,′три′)
Выводимая строка может включать в себя произвольный текст. Это позволяет форматировать текстовый вывод, вставляя в него нужные объекты. Например:
″My name {1}, {0} {1}.″ -f ″James″,″Bond″
Для каждого объекта можно задать позицию, вместе с индексом через запятую указав требуемое смещение. Для примера немного сдвинем вправо третий объект:
″{0} {1} {2,10}″ -f ″раз″,″два″,″три″
Это свойство оператора -f можно использовать при форматировании больших объемов данных. Для примера возьмем список процессов, отсортируем их по нагрузке и выведем первые десять:
$proc = Get-Process | sort cpu -Descending | select -First 10
foreach ($p in $proc) {″{0} {1}″ -f $p.processname, $p.cpu}
Как видите, вывод получается не очень информативным. Попробуем его облагородить, добавив смещение:
foreach ($p in $proc) {″{0,-10} {1,10}″ -f $p.processname, $p.cpu}
Так гораздо лучше. Кстати, смещение может быть как положительным, так и отрицательным.
Еще оператор -f позволяет выводить объекты в различных форматах. Формат задаётся специальным определителем (спецификатором) формата, указанным через двоеточие. Поддерживаемых форматов множество, давайте рассмотрим некоторые, наиболее популярные из них.
Спецификатор C (currency) возвращает объект в текущей валюте, например:
″{0:C}″ -f 100
Спецификатор N (number) означает стандартный числовой формат. Например:
″{0:N}″ -f 100
По умолчанию значение указывается с точностью до двух знаков после запятой. Это можно изменить, указав для спецификатора требуемое количество знаков после запятой. Например так выведем только целую часть числа:
″{0:N0}″ -f 100
а так увеличим точность до четырех знаков после запятой:
″{0:N4}″ -f 100
Кстати таким нехитрым способом можно производить округление чисел:
″{0:N1}″ -f 99.886
Спецификатор D (decimal) означает десятичный формат числа, а X (hexadecimal) — шестнадцатеричный. С их помощью можно переводить числа из десятичной системы в шестнадцатеричную:
″{0:X}″ -f 10
и обратно:
″{0:D}″ -f 0xA
Спецификатор E (exponential) называют научным. Если вы работаете с очень большими числами, то он вам может пригодиться. Например 1000000 (миллион) в экспоненциальном формате можно представить как 1 * 106 :
″{0:E}″ -f 1000000
С помощью спецификатора P (percent) можно представлять числа в виде процентов. Например так:
″{0:P}″ -f 0.7
или так:
″{0:P}″ -f (7/8)
При необходимости можно округлить проценты:
″{0:P0}″ -f (1/3)
или наоборот, задать нужную точность:
″{0:P4}″ -f (1/3)
Оператор -f умеет оперировать различными величинами. Для примера узнаем, сколько процентов составляет 100МБ от 1ГБ:
″{0:P}″ -f (1ooMB/1GB)
Еще оператор -f умеет работать с временем и датой. Например так выведем текущий день месяца:
″{0:dd}″ -f (Get-Date)
месяц:
″{0:MMMM}″ -f (Get-Date)
год:
″{0:уууу}″ -f (Get-Date)
и точное время:
″{0:T}″ -f (Get-Date)
При желании все это можно объединить, например так:
″{0:dd} {0:MMMM} {0:yyyy} {0:T}″ -f (Get-Date)
Но это еще не все.
Кроме стандартных спецификаторов есть еще кастомные, которые позволяют более гибко форматировать данные. Так с помощью спецификатора # (Digit placeholder) можно добавить в число разделители. К примеру, у нас есть набор цифр, который надо привести к виду телефонного номера. Сделать это можно вот такой командой:
″{0:###-##-##}″ -f 1234567
Спецификатор 0 (Zero placeholder) позволяет указывать формат числа. Например нам требуется получить четырезначное число:
″{0:0000}″ -f 123
два знака после запятой:
″{0:0.00}″ -f 123
оба эти требования вместе:
″{0:0000.00}″ -f 123
Этот способ можно использовать для округления дробей:
″{0:0.0}″ -f .123
Отдельно стоит упомянуть про запятую, которая может служить не только разделителем, но и спецификатором масштабирования чисел. Так если одна или несколько запятых указаны слева от явной или неявной десятичной запятой, то форматируемое число делится на 1000 для каждой запятой. Например:
″{0:0,0}″ -f 1234567890
″{0:0,0,}″ -f 1234567890
″{0:0,0,,}″ -f 1234567890
И еще два интересных спецификатора. Знак процента % (Percentage placeholder) приводит к умножению исходного числа на 100 перед форматированием:
″{0:0.0%}″ -f 0.123
А знак промилле ‰ (Per mille placeholder) приводит к умножению исходного числа на 1000:
″{0:0.0‰}″ -f 0.123
Примечание. Для ввода символа промилле в Windows надо при включенном NumLock нажать клавишу Alt и удерживая ее набрать на цифровой клавиатуре 0137.
На этом пожалуй и остановимся. Полный список поддерживаемых форматов можно найти здесь.