#powershell #syntax #powershell-3.0
#powershell #синтаксис #powershell-3.0
Вопрос:
Я видел упоминания об улучшенном синтаксисе PowerShell 3.0, но пока не привел пример, как это будет выглядеть?
Комментарии:
1. Какая часть этого не помогла? Похоже, вы можете его загрузить. social.technet.microsoft.com/Forums/en-AU/ITCG/thread /…
Ответ №1:
Ряд распространенных *-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
вместо $_
in на случай, если у вас или тех, для кого вы пишете сценарии, есть какая-то аллергическая реакция $_
. 🙂
И хотя это не обязательно связано с упрощенным синтаксисом, я считаю, что это упрощает мою жизнь, и мне это нравится:
C:PS> Get-ChildItem -Directory
C:PS> Get-ChildItem -File
C:PS> dir -ad
C:PS> Get-ChildItem -Attributes System Hidden Directory !Archive
Комментарии:
1. 1 для
$PSItem
. Кстати, как вы узнаете об этих вещах? Все ли это задокументировано?2. Да, мне не нравится упрощенный синтаксис с where и т. Д. … Я думаю, больше проблем, чем выгоды.
3. Я сам немного беспокоюсь об упрощенном синтаксисе. Я понимаю желание упростить доступ администраторов к PowerShell, но я не уверен, что это нечто большее, чем
bait amp; switch
. Думаю, время покажет. Что касается того, чтобы узнать об этих вещах, быть MVP имеет свои привилегии. 🙂 Если серьезно, взаимодействие между командой PowerShell и их MVP было довольно хорошим с тех пор, как они начали присуждать MVP в PowerShell еще в 2006 году.4.
$PSItem
— это отдельная переменная с тем же значением,$_
что и или это «псевдоним»? Если в конвейере я меняю$PSItem
или$_
затем автоматически изменяется другой?5. Отличный ответ, есть ли документ / сообщение в блоге, описывающее все эти изменения в одном месте?
Ответ №2:
Вот пример:
dir | where length -lt 10
До версии 3.0 это было бы
dir | where {$_.length -lt 10}
редактировать: еще один пример, на этот раз с foreach-object
dir | foreach-object length
Комментарии:
1. Я согласен с отправителем. Это то, о чем я ожидал увидеть несколько сообщений, потому что это немного облегчает чтение сценариев. Я не думаю, что мне это нравится.
Ответ №3:
У Powershell уже есть довольно чистый синтаксис, поэтому не так много, что нуждается в улучшении.
Одно новое дополнение, которое мне нравится, — это то Hash Table as objects
, где вы можете создавать объекты, передавая hastable с его свойствами:
[<ClassName>]$Variable = @{<Property>=<Value>;<Property>=<Value>}
Итак, более новый, более краткий способ создания пользовательских объектов:
$obj = [PSCustomObject]@{a=1; b=2; c=3; d=4}
Перенаправление было усилено. Теперь у вас есть потоки для подробного описания, отладки и предупреждения в дополнение к обычным (конвейерным) и ошибкам, и поэтому вы можете выполнять перенаправления, такие как 5>amp;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-
. Вы также можете обрабатывать JSON
WebRequest ConverTo-JSON
ConvertFrom-JSON
с помощью командлетов и .
Комментарии:
1. «упорядоченная хеш-таблица (словарь)»: я думал, что «словарь» и «хеш-таблица» являются синонимами. Может быть, я путаюсь в Python dicts, но словари не налагают порядок, не так ли? Можете ли вы уточнить это?