Войти

Показать полную графическую версию : [решено] Синтаксис


za1
08-09-2018, 12:26
Доброго времени суток, уважаемые!
Наткнулся на очередной интересный скрипт:
Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" -Computer localhost |
Select SystemName,DeviceID,@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},
@{Name="freespace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | Format-Table -AutoSize
и здесь мне не очень понятна вот эта часть:
@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}}
Нагуглил, что @ - оператор массива, то есть создается этот самый массив, где название "size (GB)", а вот что происходит потом?
-f($_.size/1gb)
это для отображения объема диска в Гб, но что такое -f?

Kazun
08-09-2018, 13:53
-f Format operator (https://ss64.com/ps/syntax-f-operator.html) , является сокращенной версией статического метода [String]::Format (https://msdn.microsoft.com/ru-ru/library/system.string.format(v=vs.110).aspx).

Составное форматирование (https://docs.microsoft.com/ru-ru/dotnet/standard/base-types/composite-formatting)

0 - индекс, куда подставлять
N1 - строка форматирования, в данном примере один знак после запятой

N - https://docs.microsoft.com/ru-ru/dotnet/standard/base-types/standard-numeric-format-strings

"N" или "n" Число Результат: цифры целой и дробной частей, разделители групп и разделитель целой и дробной частей с необязательным отрицательным знаком.

Поддерживается: всеми числовыми типами данных.

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

Описатель точности по умолчанию: определяется NumberFormatInfo.NumberDecimalDigits.

Дополнительные сведения см. в подразделе Описатель числового формата (N). 1234.567 ("N", en-US) -> 1,234.57

1234.567 ("N", ru-RU) -> 1 234,57

1234 ("N1", en-US) -> 1,234.0

1234 ("N1", ru-RU) -> 1 234,0

-1234.56 ("N3", en-US) -> -1,234.560

-1234.56 ("N3", ru-RU) -> -1 234,560

Select-Object - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-6

@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}} - Тип hashtable (https://ss64.com/ps/syntax-hash-tables.html) и является вычисляемым полем https://4sysops.com/archives/add-a-calculated-property-with-select-object-in-powershell/

Name (or Label) <string> - Название поля
Expression <string> or <script block> - Содержимое этого поля, в нашем случае, это скриптблок, который вычисляет размер в ГБ с последующим форматированием строки с точностью до одного знака после запятой.

Iska
08-09-2018, 14:14
Нагуглил, что @ - оператор массива, »
za1, не так.https://i.imgur.com/WHWVpZw.png
Get-Help about_Arrays -Full
А то, что Вы видите в коде — один из видов коллекций, в данном случае — https://i.imgur.com/a0ti52V.png
Get-Help about_Hash_Tables -Full
Потому данным кодом:
@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}}
и:
@{Name="freespace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}}
создаются не массивы, а хэш-таблицы, которые используется как параметры командлета Select-Object.

-f($_.size/1gb) это для отображения объема диска в Гб, но что такое -f? »
-f — это оператор формата. В выражении:
"{0:N1}" -f ($_.size / 1gb)
«"{0:N1}"» — строка формата, где {…} — место в строке, куда помещается выражение, «0» — номер выражения, которые перечислены после оператора формата (оператор может форматировать одной строкой формата несколько выражений), «:» — разделитель номера выражения и формата выражения, «N» — идентификатор одного из стандартных форматов (Standard Numeric Format Strings | Microsoft Docs (https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings)), «1» — показатель точности, попросту — число знаков после десятичной запятой (описано по той же ссылке). «-f» — собственно, сам оператор. «($_.size / 1gb)» — выражение для форматирования, берётся свойство .size текущего объекта конвеера («$_») и делится на 1 гигабайт (PowerShell позволяет использовать такие константы, как 1gb); поскольку оператор форматирования требует готового результата выражения, то выражение с делением заключается в круглые скобки.

Получающаяся хэш-таблица (которая затем будет использоваться как параметр командлета Select-Object) выглядит так:
PS C:\> @{ Name = "size(GB)"; Expression = { "{0:N1}" -f ($_.Size / 1gb) }}

Name Value
---- -----
Expression "{0:N1}" -f ($_.Size / 1gb)
Name size(GB)

za1
08-09-2018, 17:08
Спасибо, все прям по полочкам)




© OSzone.net 2001-2012