Поговорим еще немного о новых возможностях:
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
Как мы видим, теперь работа с атрибутами упростилась.