Налаштування оточення за допомогою $ 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, дуже детальну і з великою кількістю прикладів.
.