Работа с параметрами PowerShell по умолчанию для изменения их поведения

Опубликовано: 16 Марта, 2023
Работа с параметрами PowerShell по умолчанию для изменения их поведения

Если вы читали некоторые из моих других статей на этом сайте, то вы, вероятно, заметили, что я много работаю с PowerShell. Лично мне нравится работать с PowerShell, потому что он позволяет вам делать то, что вы просто не можете сделать с помощью графического интерфейса Windows. Тем не менее, нельзя отрицать, что некоторые командлеты PowerShell могут быть немного утомительными или, осмелюсь сказать, сложными в использовании. Но что, если бы существовал способ подчинить эти командлеты вашей воле и заставить их вести себя так, как вы хотите? Хотите верьте, хотите нет, но есть относительно простой способ сделать это. Вы можете изменить поведение командлета, изменив значения параметров PowerShell по умолчанию. В этой статье я покажу вам, как это делается.

Слово предостережения

Прежде чем я начну, я должен дать вам небольшое предостережение. Несмотря на то, что очень удобно иметь возможность изменять параметры командлета PowerShell по умолчанию и его поведение, это может иметь последствия. Если вы запустите сценарий, и этот сценарий предполагает, что измененный командлет будет вести себя определенным образом, вы можете получить непредсказуемые результаты. Поэтому вы должны быть осторожны при изменении параметров PowerShell по умолчанию.

Быстрый обзор

Теперь, когда я устранил предупреждение, есть две концепции PowerShell, с которыми вам необходимо ознакомиться, чтобы работать с параметрами по умолчанию. Первым из этих понятий является понятие переменной. В PowerShell имена переменных всегда начинаются со знака доллара, и вы можете просмотреть содержимое переменной, введя имя переменной.

Другая концепция, с которой вам необходимо ознакомиться, — это хэш-таблица. Хэш-таблица — это просто список, состоящий из пар ключ/значение. Чтобы дать вам быстрый пример, предположим, что мы хотим создать хеш-таблицу, содержащую названия штатов США и их сокращения. Вот как может выглядеть код:

$StateList = @{}
$StateList.add('Флорида','Флорида')
$StateList.add('Южная Каролина','SC')
$StateList.add('Грузия','GA')
$StateList

Первая строка кода создает пустую хеш-таблицу с именем $StateList. Следующие три строки добавляют записи в таблицу. Каждая запись состоит из ключа (имени состояния) и значения (аббревиатуры состояния). Последняя строка кода перечисляет содержимое таблицы. Вы можете увидеть код в действии на рисунке ниже.

Изображение 4382
Имейте в виду, что это очень простой пример и существует множество способов использования хеш-таблицы. Однако сейчас я просто хочу познакомить вас с основной концепцией.

Работа с параметрами PowerShell по умолчанию

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

Изображение 4383
Итак, что мы можем сделать с переменной $PSDefaultParameterValues? Как упоминалось ранее, вы можете управлять поведением по умолчанию любого командлета PowerShell. Единственная загвоздка в том, что вы не можете выйти за рамки существующих возможностей командлета. Итак, давайте посмотрим на пример.

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

Если вы введете командлет Get-TimeZone в PowerShell, вы увидите название часового пояса, на использование которого в данный момент настроен ПК. Пример этого вы можете увидеть на рисунке ниже.

Изображение 4384
А что, если бы мы захотели изменить этот командлет так, чтобы он не показывал, в каком часовом поясе мы находимся, а какие часовые пояса доступны для использования? Для этого нам нужно получить синтаксис командлета. Этого можно добиться с помощью командлета Get-Help, за которым следует командлет Get-TimeZone. Вы можете увидеть синтаксис командлета ниже.

Изображение 4385
Синтаксис включает параметр с именем ListAvailable. Имея это в виду, давайте введем эту команду:

$PSDefaultParameterValues.Add(“Get-TimeZone:ListAvailable”,$True)

Первая часть этой команды просто сообщает PowerShell, что мы хотим добавить значение в хеш-таблицу, точно так же, как мы делали это в примере с аббревиатурами состояний ранее в этой статье. Как и в предыдущем примере, хеш-таблица содержит пару ключ/значение. Ключом в данном случае является имя командлета (Get-TimeZone), за которым следует двоеточие и имя параметра, который мы хотим установить. В этом случае имя параметра — ListAvailable. Вторая часть командлета — это значение, которое мы хотим присвоить параметру. В этом случае я использую $True. Параметру ListAvailable обычно не требуется значение, поэтому указание $True — это то, как мы указываем PowerShell использовать параметр без необходимости присваивать ему значение.

Если вы посмотрите на рисунок ниже, то увидите команду, которую я ввел. Что еще более важно, вы можете видеть, что теперь происходит, когда я запускаю командлет Get-TimeZone.

То, что нужно запомнить

Самое важное, что нужно понимать при добавлении новых значений к параметрам PowerShell по умолчанию, — это то, что они изменяют только поведение командлета по умолчанию, а не удаляют возможности из командлета. Несмотря на то, что я изменил командлет Get-TimeZone, чтобы он показывал доступные часовые пояса вместо моего текущего часового пояса, я все равно мог отображать информацию о своем собственном часовом поясе, если хотел пропустить несколько шагов.

Еще одна вещь, которую вам нужно знать, это то, что ваши пользовательские параметры по умолчанию могут быть удалены. Чтобы удалить один элемент, используйте команду $PSDefaultParameterValues.Remove, за которой следует имя элемента, который вы хотите удалить. Например, вы можете ввести:

$PSDefaultParameterValues.Remove(“Get-TimeZone:ListAvailable”)

В качестве альтернативы вы можете очистить все содержимое хеш-таблицы с помощью этой команды:

$PSDefaultParameterValues.Clear();

Вы можете увидеть примеры обеих техник ниже:

Изображение 4386
Вы можете очистить всю хэш-таблицу или удалить один элемент.

Изменение поведения командлета PowerShell по умолчанию — это не то, что вы будете делать часто, но когда вам нужно, теперь вы знаете, как это сделать.