Поговорим еще немного о новых возможностях:
1) Возможность установки и обновления файлов помощи, используя командлет Update-Help
До выпуска PowerShell V3 CTP1,для получения помощи, вы использовали командлет Get-Help. Когда в документации находили ошибки или прочие неточности, нельзя было обновить справку для получения последних изменений. Для этого, приходилось использовать Get-Help command -Online и возможно данный недочет будет исправлен. В версии V3,данную проблему решает командлет Update-Help.
В PowerShell V3 CTP1,по умолчанию отсутствует стандартная справка, но она есть в cab файле.
Требуемые операции для обновления:
- Скачать cab файл — PowerShell V3 CTP1
- Распаковываем(expand,7-Zip,Winrar,etc)
- Update-Help –SourcePath C:\folderexpand\HelpContent -UICulture en-Us,ru-RU –Force
Более подробно, можно прочитать в блоге — http://tfl09.blogspot.com/2011/09/powershell-v3-and-updateable-help.html
2) Появилась новая встроенная переменная — $PSDefaultParameterValues
Определяет значения по умолчанию для параметров и расширенных функций. $PSDefaultParameterValues — это hash table, где ключ содержит cmdlet:param и в поле value находится стандартное значение.
PS > $PSDefaultParameterValues | gm TypeName: System.Management.Automation.DefaultParameterDictionary Name MemberType Definition ---- ---------- ---------- Add Method System.Void Add(System.Object key, System.Object value) ChangeSinceLastCheck Method bool ChangeSinceLastCheck() Clear Method System.Void Clear() Clone Method System.Object Clone() Contains Method bool Contains(System.Object key) ContainsKey Method bool ContainsKey(System.Object key) ContainsValue Method bool ContainsValue(System.Object value) CopyTo Method System.Void CopyTo(array array, int arrayIndex), System.Void CopyTo(array... Equals Method bool Equals(System.Object obj) GetEnumerator Method System.Collections.IDictionaryEnumerator GetEnumerator(), System.Collecti... GetHashCode Method int GetHashCode() GetObjectData Method System.Void GetObjectData(System.Runtime.Serialization.SerializationInfo ... GetType Method type GetType() OnDeserialization Method System.Void OnDeserialization(System.Object sender) Remove Method System.Void Remove(System.Object key) ToString Method string ToString() Item ParameterizedProperty System.Object Item(System.Object key) {get;set;} Count Property System.Int32 Count {get;} IsFixedSize Property System.Boolean IsFixedSize {get;} IsReadOnly Property System.Boolean IsReadOnly {get;} IsSynchronized Property System.Boolean IsSynchronized {get;} Keys Property System.Collections.ICollection Keys {get;} SyncRoot Property System.Object SyncRoot {get;} Values Property System.Collections.ICollection Values {get;}
Синтаксис:
$PSDefaultParameterValues["Disabled"]=$true | $false $PSDefaultParameterValues=@{"<CmdletName>:<ParameterName>"="<Value>"} $PSDefaultParameterValues=@{"<CmdletName>:<ParameterName>"={<ScriptBlock>}}
$PSDefaultParameterValues включена по умолчанию (Disabled=$false).
Подстановочные знаки разрешены в <CmdletName> и <ParameterName>.
Значение по умолчанию может быть объект или script block. В случае если передается script block:
- (script block) – сначала PowerShell вычисляет значение выражения и используется, как параметр.
- {script block} – если требуется передать script block,напрямую, заключается в {}.
Примеры использования:
#Отключить использование $PSDefaultParameterValues PS > $PSDefaultParameterValues["Disabled"]=$true #Перезапишем стандартное значение -Path="." командлета Get-ChildItem PS > $PSDefaultParameterValues=@{"Get-ChildItem:Path"="C:\"} PS > Get-ChildItem Directory: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 9/19/2011 8:16 PM PerfLogs d---- 10/5/2011 2:19 AM poshv3 d-r-- 9/20/2011 9:48 PM Program Files d---- 8/25/2011 1:00 PM Program Files (x86) d-r-- 9/19/2011 8:14 PM Users d---- 9/19/2011 8:16 PM Windows #Передадим script block,без вычисления выражения,используя двойные {} PS > $PSDefaultParameterValues=@{ "Invoke-Command:ScriptBlock"={{Get-Service | Where Status -EQ Running}} } PS > Invoke-Command Status Name DisplayName ------ ---- ----------- Running BFE Base Filtering Engine Running CryptSvc Cryptographic Services Running DcomLaunch DCOM Server Process Launcher Running DeviceAssociati... Device Association Service Running Dhcp DHCP Client Running DPS Diagnostic Policy Service Running EventLog Windows Event Log Running EventSystem COM+ Event System Running FontCache Windows Font Cache Service Running gpsvc Group Policy Client Running iphlpsvc IP Helper Running LanmanServer Server Running LanmanWorkstation Workstation Running lmhosts TCP/IP NetBIOS Helper Running LSM Local Session Manager Running MpsSvc Windows Firewall Running MSDTC Distributed Transaction Coordinator
При обновлении справки, более подробно, можно узнать:
Get-Help about_preference_variables
http://powertoe.wordpress.com/2011/09/15/powershell-default-parameters-in-v-3-0/
Так же для работы, можно воспользоваться парой функций — http://poshcode.org/2990
Введение подобного функционала, может создать проблемы в безопасности и осложнение в отладке скриптов. Так что, аккуратнее, используйте данный функционал.
3) Использование атрибутов.
Я не буду переписывать материал книги, а приведу ссылку на книгу Mastering PowerShell под авторством Tobias Weltner и конкретно раздел, где рассказывается про данный функционал — Variable Management: Behind the Scenes. После прочтение, вам станет понятным, как использовать свойство Attributes – и как его применять для V1 и V2. Так же в разделе даны, какие классы атрибутов бывают и , какие параметры они принимают.
Один из MVP по PowerShell Joel Bennett,написал функцию, где облегчается добавления данных атрибутов, к переменным. Приведу исходный код функции (http://poshcode.org/2991) :
function Protect-Variable { param( [Parameter(Mandatory=$true,Position=0)][String]$Name, [Int]$Scope = 1, [Parameter(ParameterSetName="ValidateScriptBlock")][ScriptBlock]$ScriptBlock, [Parameter(ParameterSetName="ValidateCount")][Int]$MinCount, [Parameter(ParameterSetName="ValidateCount")][Int]$MaxCount, [Parameter(ParameterSetName="ValidateLength")][Int]$MinLength, [Parameter(ParameterSetName="ValidateLength")][Int]$MaxLength, [Parameter(ParameterSetName="ValidatePattern")][Regex]$Pattern, [Parameter(ParameterSetName="ValidateRange")][Int]$MinValue, [Parameter(ParameterSetName="ValidateRange")][Int]$MaxValue, [Parameter(ParameterSetName="ValidateSet")][String[]]$Set, [Parameter(ParameterSetName="ValidateNotNull")][Switch]$NotNull, [Parameter(ParameterSetName="ValidateNotNullOrEmpty")][Switch]$NotEmpty ) $Variable = Get-Variable $Name -Scope 1 if($ScriptBlock) { $Attribute = new-object System.Management.Automation.ValidateScriptAttribute $ScriptBlock $Variable.Attributes.Add($Attribute) } if($MinCount -or $MaxCount) { if(!$MinCount) { $MinCount = [Int]::MinValue } if(!$MaxCount) { $MaxCount = [Int]::MaxValue } $Attribute = new-object System.Management.Automation.ValidateCountAttribute $MinCount, $MaxCount $Variable.Attributes.Add($Attribute) } if($MinLength -or $MaxLength) { $Attribute = new-object System.Management.Automation.ValidateLengthAttribute $MinLength, $MaxLength $Variable.Attributes.Add($Attribute) } if($Pattern) { $Attribute = new-object System.Management.Automation.ValidatePatternAttribute $Pattern $Variable.Attributes.Add($Attribute) } if($MinValue -or $MaxValue) { $Attribute = new-object System.Management.Automation.ValidateRangeAttribute $MinValue, $MaxValue $Variable.Attributes.Add($Attribute) } if($Set) { $Attribute = new-object System.Management.Automation.ValidateSetAttribute $Set $Variable.Attributes.Add($Attribute) } if($NotNull) { $Attribute = new-object System.Management.Automation.ValidateNotNullAttribute $Variable.Attributes.Add($Attribute) } if($NotEmpty) { $Attribute = new-object System.Management.Automation.ValidateNotNullOrEmptyAttribute $Variable.Attributes.Add($Attribute) } }
Как использовать:
#Добавим атрибут ValidateRange для переменной test,которая принимает значение в интервале 10-100. PS > $test = 10 PS > Protect-Variable test -MinValue 10 -MaxValue 100
Остальные примеры, можно посмотреть в книге, а также описание и использование – этих атрибутов, можно посмотреть в справке по расширенным функциям.
Get-Help about_functions_advanced_parameters
Что изменилось в V3,теперь данные атрибуты можно добавить, указав впереди переменной (возможно при объявлении).
#Добавим атрибут ValidateRange для переменной test,которая принимает значение в интервале 10-100. PS > [ValidateRange(10,100)]$test = 42 PS > $test = 101 The variable cannot be validated because the value 101 is not a valid value for the test variable. At line:1 char:1 + $test = 101 + ~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], ValidationMetadataException + FullyQualifiedErrorId : ValidateSetFailure #Добавим атрибут ValidateSet для переменной test,которая может принимать значение X,Y,Z. PS > [ValidateSet("X","Y","Z")]$test = "X" PS > $test = "hello" The variable cannot be validated because the value hello is not a valid value for the test variable. At line:1 char:1 + $test = "hello" + ~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], ValidationMetadataException + FullyQualifiedErrorId : ValidateSetFailure
Как мы видим, теперь работа с атрибутами упростилась.