Предполагается, что PowerShell 3.0 имеет более чистый синтаксис, как он выглядит? - PullRequest
5 голосов
/ 18 октября 2011

Я видел упоминания об улучшенном синтаксисе PowerShell 3.0, но пока не пример, как он будет выглядеть?

Ответы [ 3 ]

9 голосов
/ 18 октября 2011

Ряд общих командлетов *-Object использует несколько наборов параметров для выполнения упрощенного синтаксиса.Взгляните на это в V3:

C:\PS> Get-Command Where-Object -Syntax

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] [-EQ] [<CommonParameters>]

Where-Object [-FilterScript] <scriptblock> [-InputObject <psobject>] [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CGT [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNE [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -LT [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CEQ [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NE [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -GT [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLT [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -GE [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CGE [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -LE [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLE [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Like [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CLike [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotLike [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotLike [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Match [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CMatch [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotMatch [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotMatch [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Contains [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CContains [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotContains [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotContains [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -In [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CIn [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -NotIn [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -CNotIn [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -Is [<CommonParameters>]

Where-Object [-Property] <string> [[-Value] <Object>] [-InputObject <psobject>] -IsNot [<CommonParameters>]

ПРИМЕЧАНИЕ. Ознакомьтесь с новыми операторами -NotIn и -In, например:

C:\PS> 1 -In 1..5
C:\PS> 10 -NotIn 1..5

Так что упрощенный синтаксис удобен для«обычный» случай, но будьте осторожны, так как вы можете легко упасть в острые скалы и лаву, например:

C:\PS> Get-ChildItem | Where LastWriteTime.Year -eq 2010

Это ничего не возвращает и, что еще хуже, ошибки нет, поэтому вы думаете, что набор результатов "правильно "пусто", когда на самом деле этот синтаксис просто не работает, как вы могли ожидать.То есть вы не можете получить доступ к свойству собственности.Выше PowerShell ищет свойство с именем LastWriteTime.Year, которого не существует.

Также обратите внимание, что в качестве части упрощенного синтаксиса теперь вы можете использовать $PSItem вместо $_ на случай, если выили те, для кого вы пишете сценарии, имеют какую-то аллергическую реакцию на $_.: -)

И хотя это не обязательно связано с упрощенным синтаксисом, я считаю, что это упрощает мою жизнь, и мне это нравится:

C:\PS> Get-ChildItem -Directory
C:\PS> Get-ChildItem -File
C:\PS> dir -ad
C:\PS> Get-ChildItem -Attributes System+Hidden+Directory+!Archive
7 голосов
/ 18 октября 2011

Вот пример:

dir | where length -lt 10

До 3.0 это было бы

dir | where {$_.length -lt 10}

edit: еще один пример, на этот раз с foreach-object

dir | foreach-object length

5 голосов
/ 18 октября 2011

Powershell уже имеет довольно чистый синтаксис, так что не так много нужно улучшать.

Одно новое дополнение, которое мне нравится, это Hash Table as objects, где вы можете создавать объекты, передавая hastable со своими свойствами:

[<ClassName>]$Variable = @{<Property>=<Value>;<Property>=<Value>}

Итак, более новый, более лаконичный способ создания пользовательских объектов:

$obj = [PSCustomObject]@{a=1; b=2; c=3; d=4}

Перенаправление увеличено. Теперь у вас есть потоки для подробного, отладочного и предупреждающего сообщений в дополнение к обычным (конвейер) и ошибкам, и вы можете выполнять перенаправления, такие как 5>&1

Вы можете использовать переменную предпочтения $PSDefaultParameterValues для установки значений параметров по умолчанию для командлетов.

Существует новый ускоритель [ordered] для создания упорядоченной таблицы (словарь):

 $a = [ordered]@{a=1;b=2;d=3;c=4}

Из другого ответа здесь, в SO, я понял, что -in был новым в Powershell v3.0:

Итак, вы делаете что-то вроде 1 -in 1,2,3. Ранее у нас было только -contains

командлеты:

Вы можете обновить справку с помощью Update-Help командлета. Существуют командлеты, связанные с сетью, такие как Invoke- WebRequest. Вы также можете обрабатывать JSON с помощью командлетов ConverTo-JSON и ConvertFrom-JSON.

...