Сервісний центр VPSGroup ремонт комп'ютерної техніки, заправка картриджів, ремонт оргтехніки, Київ, Виставковий центр, Васильківська, 55

Налаштування оточення за допомогою $ PSDefaultParameterValues.

Кожен командлет і функція в PowerShell має значення параметрів за замовчуванням, які використовуються в тих випадках, коли команда запускається без явної вказівки параметрів. Автоматична змінна $ PSDefaultParameterValues ​​дозволяє перевизначити їх, вказавши для командлет альтернативні повернуться до стандартних значень.Ця можливість може бути корисною в тому випадку, якщо вам доводиться регулярно виконувати однотипні команди з однаковим набором параметрів.

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

Get-ChildItem -Path C: \ Books -Force



Припустимо, що нам потрібно регулярно переглядати вміст цієї папки. Для того, щоб полегшити собі життя і позбутися від введення параметрів, пропишемо в змінній $ PSDefaultParameterValues ​​для командлет Get-CildItem шлях за замовчуванням і додамо параметр Force:

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

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



А якщо подивитися вміст змінної $ PSDefaultParameterValues, то можна побачити, що вона вдає із себе самий звичайний хеш-масив типу "Name" = "Value".



Повертаємося до нашого прикладу. Концепція змінилася і тепер нам потрібно рекурсивно переглядати вміст всіх підпапок, включаючи файли з атрибутом "прихований" і "тільки для читання".Попередній спосіб повністю перезаписує весь вміст змінної, тому для додавання скористаємося методом Add:

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

Як варіант, додати параметр можна за допомогою оператора додавання (+ =), наприклад:

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

Ну і оскільки параметр Force більш не потрібен, видаляємо його з допомогою методу Remove:

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



В результаті отримуємо таку картину.



оскільки змінна представляє з себе масив, до окремих параметрів можна звертатися як до елементів масиву, наприклад так:

$ PSDefaultParameterValues ​​[ 'Get-ChildItem: Attributes']

або так:

$ PSDefaultParameterValues.'Get-ChildItem: Attributes'

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

$ PSDefaultParameterValues ​​[ 'Get-ChildItem: Attributes'] = 'D'



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

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

Перевіримо поточний час і виконаємо команду Get-ChildItem. Оскільки умова дотримана, команда видає вміст папки повністю. А потім переведемо годинники, повторимо операцію і порівняємо результати. Як бачите різниця в наявності. Звичайно приклад не дуже життєвий, проте він досить наочно демонструє можливості змінної $ PSDefaultParameterValues.



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

$PSDefaultParameterValues.Clear()

Но більш зручно призупинити вплив змінної, відключити її:

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

В цьому випадку весь вміст змінної зберігається, але не застосовується.Включити її назад можна, видаливши параметр Disabled або задавши йому параметр $ false.



І ще пара моментів, які варто мати на увазі.

• Змінна $ PSDefaultParameterValues ​​з'явилася в PowerShell 3.0.
• Змінна $ PSDefaultParameterValues ​​є глобальною і, відповідно, впливає на всі команди, функції і скрипти, що запускаються в поточному сеансі.Іноді це може привести до небажаних результатів.
• Змінна $ PSDefaultParameterValues ​​визначена в поточному сеансі та її вміст зберігається тільки до виходу з цього сеансу. Якщо ви хочете використовувати будь-які параметри постійно, то можна визначати змінну в своєму профілі.

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

.