Заметки о Windows и других программных продуктах Microsoft...

Настройка окружения с помощью $PSDefaultParameterValues

Настройка окружения с помощью $PSDefaultParameterValues

Каждый командлет и функция в PowerShell имеет значения параметров по умолчанию, которые используются в тех случаях, когда команда запускается без явного указания параметров. Автоматическая переменная $PSDefaultParameterValues позволяет переопределить их, указав для командлета альтернативные значения параметров по умолчанию. Эта возможность может быть полезной в том случае, если вам приходится регулярно выполнять однотипные команды с одинаковым набором параметров.

Для примера возьмем командлет Get-CildItem (он же gci, он же dir, он же ls). Напомню, что выполненный без параметров он выводит содержимое текущей директории, исключая скрытые и системные файлы.  К примеру для того, чтобы просмотреть все содержимое папки C:\Books, нам надо выполнить команду:

Get-ChildItem -Path C:\Books -Force

вывод командлета Get-ChildItem

 

Предположим, что нам требуется регулярно просматривать содержимое данной папки. Для того, чтобы облегчить себе жизнь и избавиться от ввода параметров, пропишем в переменной $PSDefaultParameterValues для командлета Get-CildItem путь по умолчанию и добавим параметр Force:

$PSDefaultParameterValues = @{′Get-ChildItem:Path′=′C:\Books′;′Get-ChildItem:Force′=$true}

После этого команда Get-CildItem, выполненная без дополнительных параметров, будет показывать нам все содержимое папки C:\Books, включая скрытые файлы.

изменение настроек по умолчанию

 

А если посмотреть содержимое переменной $PSDefaultParameterValues, то можно увидеть, что она представляет из себя самый обычный хэш-массив типа ″Name″=″Value″.

содержимое переменной $PSDefaultParametersValues

 

Возвращаемся к нашему примеру. Концепция изменилась и теперь нам требуется рекурсивно просматривать содержимое всех подпапок, включая файлы с атрибутом ″скрытый″ и ″только для чтения″. Предыдущий способ полностью перезаписывает все содержимое переменной, поэтому для добавления воспользуемся методом Add:

$PSDefaultParameterValues.Add(′Get-ChildItem:Recurse′,$true)

Как вариант, добавить параметр можно с помощью оператора добавления (+=),  например:

$PSDefaultParameterValues += @{′Get-ChildItem:Attributes′=′R+H′}

Ну и поскольку параметр Force более не нужен, удаляем его с помощью метода Remove:

$PSDefaultParameterValues.Remove(′Get-ChildItem:Force′)

добавление и удаление параметров в переменной $PSDefaultParametersValues

 

В результате получаем такую картину.

вывод Get-ChildItem с новыми параметрами

 

Поскольку переменная представляет из себя массив, к отдельным параметрам можно обращаться как к элементам массива, например так:

$PSDefaultParameterValues[′Get-ChildItem:Attributes′]

или так:

$PSDefaultParameterValues.′Get-ChildItem:Attributes′

А для изменения значения параметра достаточно присвоить элементу массива новое значение. В качестве примера изменим параметр Attributes так, чтобы команда выдавала только имена директорий:

$PSDefaultParameterValues[′Get-ChildItem:Attributes′] = ′D′

редактирование существующих параметров в $PSDefaultParametersValues

 

Но это еще не все. Параметры можно задавать динамически, в зависимости от определенных условий. Предположим, что показывать скрытые и системные файлы в папке C:\Books требуется только в течение рабочего дня, скажем до 20:00. Для этого зададим переменной такое значение, при котором параметр Force принимает значение $true только в том случае, если текущее время (в часах) меньше чем 19 часов:

$PSDefaultParameterValues = @{′Get-ChildItem:Force′={if ([DateTime]::Now.Hour -le 19){$true}}}

Проверим текущее время и выполним команду Get-ChildItem. Поскольку условие соблюдено, команда выдает содержимое папки полностью. А затем переведем часы, повторим операцию и сравним результаты. Как видите разница налицо. Конечно пример не очень жизненный, однако он достаточно наглядно демонстрирует возможности переменной $PSDefaultParameterValues.

динамическое изменение параметров $PSDefaultParametersValues

 

Если необходимо вернуться к значениям по умолчанию, то можно очистить переменную с помощью метода Clear:

$PSDefaultParameterValues.Clear()

Но более удобно приостановить влияние переменной, отключить ее:

$PSDefaultParameterValues.Add(′Disabled′,$true)

В этом случае все содержимое переменной сохраняется, но не применяется. Включить ее обратно можно, удалив параметр Disabled или задав ему параметр $false.

отключение переменной $PSDefaultParametersValues

 

И еще пара моментов, которые стоит иметь в виду.

• Переменная $PSDefaultParameterValues появилась в PowerShell 3.0.
• Переменная $PSDefaultParameterValues является глобальной и, соответственно, оказывает влияние на все команды, функции и скрипты, запускаемые в текущем сеансе. Иногда это может привести к нежелательным результатам.
• Переменная $PSDefaultParameterValues определена в текущем сеансе и ее содержимое сохраняется только до выхода из этого сеанса.  Если вы хотите использовать какие либо параметры постоянно, то можно определять переменную в своем профиле.

На этом все. Более подробную информацию о переменной $PSDefaultParameterValues можно узнать, выполнив в консоли команду Get-Help about_Parameters_Default_Values. А также здесь можно найти отличную статью об использовании $PSDefaultParameterValues, очень подробную и с большим количеством примеров.

 
 
Комментарии

Пока нет комментариев.