Feeds:
Записи
Комментарии

Archive for Октябрь 2011

Поговорим еще немного о новых возможностях:

1)      Возможность установки и обновления файлов помощи, используя  командлет Update-Help

До выпуска PowerShell V3 CTP1,для получения помощи, вы использовали командлет Get-Help. Когда в документации находили ошибки или прочие неточности, нельзя было обновить справку для получения последних изменений. Для этого, приходилось использовать Get-Help command -Online и возможно данный недочет будет исправлен. В версии V3,данную проблему решает командлет Update-Help.

В PowerShell V3 CTP1,по умолчанию отсутствует стандартная справка, но она есть в cab файле.

Требуемые операции для обновления:

  1. Скачать cab файл —  PowerShell V3 CTP1
  2. Распаковываем(expand,7-Zip,Winrar,etc)
  3. 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:

  1. (script block) – сначала PowerShell вычисляет значение выражения и используется, как параметр.
  2. {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

Как мы видим, теперь работа с атрибутами упростилась.

Реклама

Read Full Post »