Наверное у многих возникало желание делать в начале своего скрипта проверку например версии PowerShell. Ведь если вы используете новые возможности 2.0, а файл будет запущен под 1.0, то часть команд сработает, а другая нет, что в результате может привести как минимум к ошибкам, а как максимум – к большим проблемам.
Вообще написать проверку версии несложно. У PowerShell 2.0 есть специальная переменная, $PSVersionTable в которой содержится вся необходимая информация о версии:
[PS <1> C:\root] $psversiontable Name Value ---- ----- CLRVersion 2.0.50727.4918 BuildVersion 6.1.7100.0 PSVersion 2.0 WSManStackVersion 2.0 PSCompatibleVersions {1.0, 2.0} SerializationVersion 1.1.0.1 PSRemotingProtocolVersion 2.0
Ну а версию 1.0 легко опознать по отсутствию этой переменной 🙂 В результате получаем такую функцию:
function Get-Version {if ($PSVersionTable){$PSversionTable.PSVersion.ToString()} else {"1.0"}}
Но на самом деле всё это – лишние движения. Всё можно сделать гораздо проще.
Если ваш скрипт требует версии 2.0, вам достаточно в его начале поместить следующую строку:
#Requires -Version 2.0
PowerShell поймёт эту директиву, и при попытке запуска сценария в оболочке с версией ниже указанной, выдаст ошибку:
PS C:\Temp> . C:\Temp\test.ps1 The script 'test.ps1' cannot be run because it contained a "#requires" statement at line 1 for Windows PowerShell version 2.0 which is incompatible with the installed Windows PowerShell version of 1.0. At line:1 char:2 + . <<<< C:\Temp\test.ps1
Вполне понятно, и не сложно.
Ниже, полный список критериев которые позволяет указать деректива Requires:
#requires -shellid #requires -version #requires -pssnapin [-version ]
Например чтобы разрешить запуск сценария лишь в оболочке с подгруженной оснасткой AD Cmdlets, достаточно сделать так:
#Requires -PSSnapin Quest.ActiveRoles.ADManagement
Можно даже указать конкретную версию оснастки добавив ключ –Version. Причем если вы это сделаете, скрипт будет выполнятся именно с этой версией. Даже если установлена более поздняя – будет выдана ошибка.