sergey vasin

The IT blog

Используем значения по умолчанию для упрощения скриптов PowerShell – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Приглашенный блогер Microsoft PowerShell MVP Dave Moravec рассказывает об использовании параметров по умолчанию для упрощения скриптов Windows PowerShell.

Я занимаюсь IT уже 15 лет. Последние 10 из них я преимущественно работаю с технологиями управления Microsoft. Я работаю в одной из крупнейших интернациональных финансовых компаний в качестве администратора, ответственного за System Center: Configuration Manager (SCCM). Мне нравится автоматизировать мои задачи при помощи Windows PowerShell. Я являюсь автором и докладчиком на Microsoft Czech Republic и веду блог на PowerShell.cz. Также вы можете найти меня в Twitter @makovec.

Изменяем значения по умолчанию

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

Как она работает? С помощью переменной $PSDefaultParameterValues вы можете указывать (переопределять) значения по умолчанию для параметров командлетов PowerShell. На самом деле я обнаружил, что в блоге Hey, ScriptingGuy! уже обсуждался этот вопрос около месяца назад — PowerTip: Автоматическое форматирование таблиц в PowerShell. Я же покажу еще несколько способов практического применения этой функции.

Как указать значение по умолчанию

Давайте представим, что вы часто работаете с заданиями (Jobs) Windows PowerShell (и я уверен, что так и есть!). Я приведу по-настоящему сложный пример:

PS> Start-Job -Name sj -ScriptBlock { $pid } | Wait-Job | Receive-Job

   8828

   PS> Receive-Job -Name sj

   PS>

При запуске командлета Receive-Job во второй раз не выводится никаких результатов, как и ожидалось. Если вы хотите оставить данные в очереди, вам нужно указать параметр -Keep. Используя $PSDefaultParameterValues, вы можете указать PowerShell каждый раз устанавливать параметр -Keep в True. $PSDefaultParameterValues – это хеш-таблица, в которой Key – это комбинация ИмяКомандлета:ИмяПараметра, а Value – это то значение, которое вы хотите назначить. В нашем примере команда будет следующей:

PS> $PSDefaultParameterValues = @{‘Receive-Job:Keep’=$true}

Вы можете видеть, что параметру Keep командлета Receive-Job мы назначили значение $True (так как это переключатель (switch), значение True свидетельствует о том, что он включен).

PS> Start-Job -Name sj2 -ScriptBlock { $pid } | Wait-Job | Receive-Job

   2433

   PS> Receive-Job -Name sj2

   2432

   PS>

Если вы проверите значение $PSDefaultParameterValues, то вы увидите, что это действительно хеш-таблица.

PS> $PSDefaultParameterValues

   Name                   Value

   —-                   ——

   Receive-Job:Keep       True

Если вы хотите переопределить значение по умолчанию, вы можете указать параметр Keep со значением $False непосредственно в команде:

PS> Start-Job -Name sj3 -ScriptBlock { $pid } | Wait-Job | Receive-Job –Keep:$false

   998

   PS> Receive-Job -Name sj3

   PS>

Еще одно найденное мной применение переменной $PSDefaultParameterValues касается работы с командлетом Export-Csv. Я часто экспортирую большие объемы данных из нашей инфраструктуры и передаю их боссу в формате Csv. И мне не нравится поведение командлета по умолчанию, так как он включает информационную строку в начало файла. Я решил изменить это. Кроме того, так я работаю с различными языковыми настройками, я также решил поменять разделитель (delimiter).

  PS> $PSDefaultParameterValues = @{‘Export-Csv:Delimiter’=’;’; ‘Export-Csv:NoTypeInformation’=$true}

   PS> Get-Process -Name p* | Select Name, WS | Export-Csv -Path c:\tmp\ps.csv

   PS> Get-Content C:\tmp\ps.csv

   “Name”;”WS”

   “powershell_ise”;”17477223’

  

   PS> $PSDefaultParameterValues

   Name                            Value

   —-                            ——

   Export-Csv:Delimiter            ;

   Export-Csv:NoTypeInformation    True

Работает как заклинание, но в последнем выводе вы можете заметить неожиданный сюрприз. Модификации переменной, выполненные нами в первом примере (Receive-Job) исчезли. Я думаю, вы поняли, что это произошло во время нашего второго изменения переменной $PSDefaultParameterValues. Для того, чтобы этого избежать, мы будем использовать техники работы с хеш-таблицами. Существует два варианта:

PS> $PSDefaultParameterValues[‘Receive-Job:Keep’]=$true

PS> $PSDefaultParameterValues.Add(‘Enter-PSSession:ComputerName’, ‘localhost’)

После этого, в переменной появились две новые записи, и всего их теперь четыре.

PS> $PSDefaultParameterValues

   Name                            Value

   —-                            ——

   Export-Csv:Delimiter            ;

   Receive-Job:Keep                True

   Export-Csv:NoTypeInformation    True

   Enter-PSSession:ComputerName    localhost

Вы можете немедленно попробовать поработать с новыми значениями. Теперь, при вводе Enter-PSSession вы подключаетесь к локальному компьютеру. Это возможно не так полезно, так что вы можете изменить это значение на имя сервера, к которому вы подключаетесь наиболее часто.

Еще варианты использования переменной $PSDefaultParameterValues:

  • $PSDefaultParameterValues = @{‘Get-ChildItem:Force’ = $true} – позволяет вам запускать команду dir со включенным параметром Force, так что вы сможете увидеть скрытые файлы и папки.
  • $PSDefaultParameterValues = @{‘*:Credential’ = $cred} – бывает достаточно полезной, если вы храните учетные данные администратора в переменной. $PSDefaultParameterValues поддерживает символы подстановки. Этот пример позволит использовать учетные данные во всех командлетах, их поддерживающих.
  • Вы слышали о людях, которые переводят свои часы на 10 минут вперед? Давайте применим эту практику в WindowsPowerShell: $PSDefaultParameterValues = @{‘Get-Date:Date’ = {[System.DateTime]::Now.AddMinutes(10)}}. Здесь я применил возможность указывать ScriptBlock в качестве значения для параметра.

Я знаю, последний пример не очень серьезный. Вы можете делать даже более странные вещи, но я не буду приводить здесь этих примеров.

Изменяем значения по умолчанию

Если вам потребуется изменить значение по умолчанию, вы можете воспользоваться стандартными техниками работы с хеш-таблицами. Мы изменим разделитель для командлета Export-Csv:

PS> $PSDefaultParameterValues[‘Export-Csv:Delimiter’]=’%’

Теперь все экспортированные мной Csv будут разделяться с помощью знака процента. Если мне это не понравится, я могу переопределить это поведение прямо в команде, как я это делал в случае с командлетом Receive-Job.

PS> Get-Process –Name p* | Select Name, WS | Export-Csv –Path c:\tmp\ps.csv –Delimiter ‘,’

   PS> Get-Content c:\tmp\ps.csv

   “Name”,”WS”

   “powershell_ise”,”17477223’

Удаляем значения по умолчанию

Если вам потребуется удалить настройки из переменной $PSDefaultParameterValues, вы можете либо удалить одну запись, или удалить все содержимое переменной полностью. Удаление одной записи выполняется так же просто, как и ее добавление, просто используйте метод Remove:

PS> $PSDefaultParameterValues

PS> $PSDefaultParameterValues.Remove(‘Enter-PSSession:ComputerName’)

PS> $PSDefaultParameterValues

Удаление всего содержимого переменной выполняется с помощью командлета Remove-Variable. Так как $PSDefaultParameterValues является автоматической переменной, выполнение командлета Remove-Variable приведет только к удалению ее содержимого. Но так как в команду Windows PowerShell входит множество умных людей, они добавили опцию временного отключения переменной $PSDefaultParameterValues. Вы можете установить запись с именем Disable в значение True, и переменная $PSDefaultParameterValues перестанет оказывать влияние на значения параметров командлетов.

 01

Вы можете видеть это на рисунке выше. Я удалил все содержимое переменной $PSDefaultParameterValues и затем установил разделитель для Export-Csv. Следующие несколько строк тестируют функциональность включенной и отключенной переменной $PSDefaultParameterValues. В качестве подтверждения, вы можете видеть содержимое трех экспортированных файлов.

Еще несколько советов

Вы наверняка знакомы с концепцией областей (scopes) в Windows PowerShell (если нет, ознакомьтесь с файлом справки about_Scopes). Если вы определяете $PSDefaultParameterValues в глобальной области (Global Scope), она будет унаследована областями ваших скриптов и функций. Иногда это может приводить к нежелательным эффектам. В этом случае вы можете использовать отключение $PSDefaultParameterValues.

Второе, о чем вы должны знать, это то, что переменная $PSDefaultParameterValues активна только в вашей текущей сессии. Если вам нужно сохранить ее значения на постоянной основе, вам нужно внести ее в профиль.

Для дальнейшего изучения переменной $PSDefaultParameterValues, рекомендую ознакомиться с файлом справки about_Parameters_Default_Values.

~David

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/12/03/use-powershell-default-parameter-values-to-simplify-scripts.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Декабрь 9, 2012 в 13:13

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s