PowerShell - [решено] Синтаксис

Ответить
Аватара пользователя
za1

PowerShell - [решено] Синтаксис

Сообщение za1 »

Доброго времени суток, уважаемые!

Наткнулся на очередной интересный скрипт:



Код:

Код: Выделить всё

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

Re: PowerShell - [решено] Синтаксис

Сообщение Kazun »

-f Format operator
, является сокращенной версией статического метода
[String]::Format
.



Составное форматирование




0 - индекс, куда подставлять

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



N -
https://docs.microsoft.com/ru-ru/dot...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/pow...w=powershell-6




@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}} - Тип
hashtable
и является вычисляемым полем
https://4sysops.com/archives/add-a-c...in-powershell/




Name (or Label) - Название поля

Expression or - Содержимое этого поля, в нашем случае, это скриптблок, который вычисляет размер в ГБ с последующим форматированием строки с точностью до одного знака после запятой.
Аватара пользователя
Iska

Re: PowerShell - [решено] Синтаксис

Сообщение Iska »

Цитата za1:



Нагуглил, что @ - оператор массива,
PowerShell - [решено] Синтаксис




za1, не так.


Массив

[spoiler]



Код:
[/spoiler]

Код: Выделить всё

Get-Help about_Arrays -Full







А то, что Вы видите в коде — один из видов коллекций, в данном случае —


хэш-таблица

[spoiler]Изображение



Код:
[/spoiler]

Код: Выделить всё

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.




Цитата za1:



-f($_.size/1gb) это для отображения объема диска в Гб, но что такое -f?
PowerShell - [решено] Синтаксис




-f — это оператор[/i] формата. В выражении:



Код:

Код: Выделить всё

"{0:N1}" -f ($_.size / 1gb)

«"{0:N1}"» — строка формата, где {…} — место в строке, куда помещается выражение, «0» — номер выражения, которые перечислены после оператора формата (оператор может форматировать одной строкой формата несколько выражений), «:» — разделитель номера выражения и формата выражения, «N» — идентификатор одного из стандартных форматов (
Standard Numeric Format Strings | Microsoft Docs
), «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

Re: PowerShell - [решено] Синтаксис

Сообщение za1 »

Спасибо, все прям по полочкам)
Ответить

Вернуться в «Скриптовые языки администрирования Windows»