PowerShell – контроль окружения


 

   PowerShell 2.0 уже появился в релизе Windows 7 и Windows Server 2008 R2 и вот вот появится для остальных версий Windows. Очивидно, что различие версий PowerShell требует некоторого контроля за использованием новых фич. К тому же, как известно, PowerShell основывается на .NET Framework. Это означает, что скрипт может использовать некоторые особенности старшей версии PowerShell, более новой версии .NET Framework и использовать особенности версии операционной системы. Следовательно для надежной работы скрипта надо контролировать версию PowerShell, версию .NET Framework и версию операционной системы.

   Получить версию PowerShell достаточно просто:

PS U:\> Get-Host

Name : ConsoleHost

Version : 2.0

InstanceId : f1738d90-0853-4686-8c02-44851432652f

UI : System.Management.Automation.Internal.Host.InternalHostUserInterface

CurrentCulture : en-US

CurrentUICulture : en-US

PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy

IsRunspacePushed : False

Runspace : System.Management.Automation.Runspaces.LocalRunspace

  

   Либо более подробно:

PS U:\> (Get-Host).Version

Major Minor Build Revision

—— —— —— ———

2 0 -1 -1

 

   Получить версию .NET Framework common language runtime:

PS U:\> [System.Environment]::Version

Major Minor Build Revision

—— —— —— ———

2 0 50727 4927

 

   Да это результат выполнения на Windows 7. Почему не 3.5 ? Скорее всего выводится именно то, что указаоно в документации: версия common language runtime (CLR), а она имеет номер 2. Другое дело библиотеки .NET Framework и их версия. Я нашел вот такой несколько странный способ выяснить какой «донет» установлен на компьютере:

PS U:\> (Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent").Property

.NET CLR 2.0.50727

SLCC2

.NET CLR 3.5.30729

.NET CLR 3.0.30729

Media Center PC 6.0

InfoPath.3

PS U:\> (Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent").Property | Where-Object { $_.ToString() -like ".NET*" }

.NET CLR 2.0.50727

.NET CLR 3.5.30729

.NET CLR 3.0.30729

 

   Несмотря на странность этого метода, он работает! Изначально метод рассчитан на извещение браузером web-сервера какая версия «дотнет» установлена на клиенте, для того чтобы сервер мог корректно сгенерировать код страницы для клиента. Но это не мешает нам использовать его в PowerShell для контроля окружения.

   Получить версию операционной системы:

PS U:\> [System.Environment]::OSVersion | fl

Platform : Win32NT

ServicePack :

Version : 6.1.7600.0

VersionString : Microsoft Windows NT 6.1.7600.0

 

   Как видите, мы можем получить не только номер версии ОС, но и номер установленного сервиспака. Меня несколько смутило указание Win32NT, но оказалось, что это не имеет отношения к 32/64 bit архитектуре http://msdn.microsoft.com/en-us/library/3a8hyw88.aspx

   Что еще может оказаться важным для выполнения скрипта? Текущая локаль. Ее можно посмотреть так:

PS U:\> (Get-Host).CurrentCulture

LCID Name DisplayName

—- —- ————

1033 en-US English (United States)

 

   В PowerShell 2.0 есть директива #requires, которая позволяет контролировать некоторые параметры окружения.

   Например можно указать минимальную версию PowerShell:

#requires –Version 2.0

   Либо тоже самое сделать для SnapIn:

#requires –PsSnapIn Microsoft.WSMan.Management –Version 2

   Еще можно проверить имя «сборки»:

#requires –ShellId MyShell

   Последняя команда относится к новой фиче PowerShell 2.0, которая позволяет создавать свои собственные «закрытые» консоли на базе PowerShell. О том как это сделать, можно прочитать в документации How to Create a Console Shell.

 

Источники:

1. about_requires.help.txt

2. about_PSSnapins.help.txt

3. http://msdn.microsoft.com/en-us/library/aa480198.aspx

4. http://msdn.microsoft.com/en-us/library/system.environment.aspx

5. http://support.microsoft.com/kb/315291

Реклама

комментария 2

  1. >Получить версию PowerShell достаточно просто:
    PS U:\> Get-Host

    Get-Host дает нам версию хоста, но не PowerShell.
    Так, например, если выполнить результат выполнения (Get-Host).Version в PowerGUI Script Editor v 2.2.0.1358 даст следующий результат:
    Major Minor Build Revision
    —— —— —— ———
    2 2 0 1358

    Версию PowerShell, можно узнать так:
    $PSVersionTable.PSVersion

    PS Правда, ЕМНИП, в версии 1.0 PoSh автоматическая переменная $PSVersionTable, вообще, отсутствовала.

    • Спасибо за дополнение!

      С учетом того, что Powershell 1.0 сошел со сцены, $PSVersionTable.PSVersion мне нравится больше. А полезность Get-Host какая-то сомнительная: опоробуйте посмотреть в разных оболочках ее вывод (например в Exchange).

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: