Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета Pyatilistnik.org. В прошлый раз мы с вами очень подробно разобрали, как производится подключение к удаленному рабочему столу в разных операционных системах. Сегодня я вам так же хочу упростить жизнь и научить классным возможностям PowerShell. Мы научимся бороться с рутиной, созданием и использованием функций PowerShell, которые войдут в вашу жизнь так, что вы уже больше не сможете без них представить свое рабочее окружение, ведь проще запомнить одну команду, чем вспоминать, где располагаются ваши скрипты, какое у них имя и так далее.
Что такое функции PowerShell?
Функция — это список операторов Windows PowerShell, которым присвоено имя. Когда вы запускаете функцию, вы вводите имя функции. Операторы в списке запускаются так, как если бы вы ввели их в командной строке. Я бы сказал: внутри функции вы можете размещать коды, операторы, параметры и так далее. У этой функции есть имя.
И это имя используется для запуска вашей функции.
Использование функций в конвейере Windows PowerShell 5
По своему опыту хочу отметить, что если вы очень часто используете какие-то сценарии, то старайтесь переводить и сохранять их в функции, это будет экономить много времени, не забывайте делиться этими функциями в галереи PowerShell или github, давайте помогать друг другу.
Подробнее об этом можно прочитать в справке MS:
- https://docs.microsoft.com/ru-ru/powershell/scripting/learn/ps101/09-functions?view=powershell-7.1
- https://docs.microsoft.com/ru-ru/powershell/module/microsoft.powershell.core/about/about_functions?view=powershell-7.1
Представим себе ситуацию, что у вас есть какие-то повседневные задачи, которые вы решаете через скрипты PowerShell, например:
- Часто ищите ID сессии пользователя на RDS ферме
- Ищите события блокировки пользователя в Active Directory
- Тестируете репликацию Active Directory
- Или доступность основного шлюза
Вариантов ваших повседневных или часто выполняемых задач можете быть огромное количество, главный посыл, что все это можно упростить, создав функции и модули, которые проще использовать и вызывать, чем постоянно вспоминать, где у вас тот или иной скрипт.
Как создавать функции в PowerShell
Иногда мне приходится удалять старые профили с серверов, там я использую утилиту delprof2.exe, о которой я подробно уже писал. Там где мне нужна автоматизация, я создал bat-файл и все живет своей жизнью, а для разовых вещей я использую скрипт. Периодически я его теряю или забываю, где он лежит. поэтому я решил превратить его в функцию, которую легко смогу вызывать по ключевому имени.
Итак, обо всем по порядку, нам нужно определить, как мы будем запускать delprof2. Для моей функции я решил, что у меня будет стандартное расположение .exe и сделать его необязательным параметром:
15 Useful PowerShell Commands for Beginners | Learn Microsoft PowerShell
Param (
.
[string]$delprof2 = «c:windowssystem32delprof2.exe»
)
Я выбрал system32, потому что это начальный путь по умолчанию для PowerShell с повышенными привилегиями, но выберите то, что вам подходит. Чтобы фактически запустить delprof2, мы теперь используем амперсанд $delprof2 ‘/l’
Затем, чтобы получить результат, нам нужно присвоить его переменной:
$output = ^Ignoring profile ‘(?
\\([^\]+\)+(?[^’]+))’ (reason: (?[^)]+))»)
Далее, мы можем построить возвращаемый объект:
Включенные профили немного проще, дополнительной информации для анализа нет. Итак, регулярное выражение будет выглядеть так:
if ($line -match «^(?
\\([^\]+\)+(?S+))»)
Это дает нам больше полезных данных, которые мы можем использовать в возвращаемом объекте:
Поскольку нам действительно нужно иметь возможность определять параметры для этой функции и мы также хотим иметь возможность принимать ввод с некоторыми параметрами. Для param блока мы можем начать с ( Parameter() для краткости исключаю настройки):
param (
[string]$Name
,
[string[]]$Include
,
[string[]]$Exclude
,
[int]$OlderThan
)
Так что нам понадобится пара циклов foreach, чтобы получить все переключатели в массиве:
$switches =
«/l»
if ($PSBoundParameters.ContainsKey(‘Include’)) <
foreach ($inc in $include) <
«/id:$inc»
>
>
if ($PSBoundParameters.ContainsKey(‘Exclude’)) <
foreach ($exc in $exclude) <
«/ed:$exc»
>
>
if ($PSBoundParameters.ContainsKey(‘OlderThan’)) <
«/d:$OlderThan»
>
>
if ($PSBoundParameters.ContainsKey(‘Name’) -and ($Name -ne $env:COMPUTERNAME)) <
if (Test-Connection $Name -Count 1 -Quiet) <
$computer += «/c:$Name»
> else <
Throw «Cannot ping $name»
>
>
И теперь наша команда будет выглядеть так:
$return = Файл» и выберите «Сохранить». Чтобы сделать вашу функцию доступной для всех пользователей, сохраните ее в ProgramFilesWindowsPowerShellModulesGet-InactiveUserProfiles.
Это означает, что вы должны создать там папку с тем же именем, что и ваш файл. Выберите Тип psm1.
Щелкните Сохранить. Закройте все сеансы PowerShell. Снова откройте PowerShell и запустите Get-Module, чтобы просмотреть новый модуль сценария.
Get-Module -ListAvailable
А вот и ваш новый модуль и его функция:
Get-Command -Module Get-InactiveUserProfiles | Format-List
Начиная с PowerShell 3.0 ваш модуль импортируется автоматически, а это означает, что ваша команда доступна мгновенно. Нет необходимости импортировать ваш модуль. Теперь мы можем проверять наличие неактивных профилей пользователей локально или удаленно! Давай попробуем, чтобы проверить локальный компьютер введите:
Get-InactiveUserProfiles | Format-Table
Или если бы мы хотели получить только те профили, которые начинаются с «А» и не использовались более 20 дней:
Get-InactiveUserProfiles -Include ‘А*’ -OlderThan 20 | Format-Table
Помните, что мы можем принимать как входные, так и выходные объекты конвейера? Да, так что мы можем сделать несколько довольно интересных вещей, например, если вам нужно очистить профиль на нескольких компьютерах:
Get-ADComputer -Filter | Get-InactiveUserProfiles -Exclude ‘Administrator’ -OlderThan 10 | Where-Object
Это будет список профилей со всех компьютеров, возвращенных в этом запросе к AD, которые не являются профилем Administrator и не были использованы в течение 10 дней. Обратите внимание, что я использую командлет Where-Object для фильтрации только тех профилей, которые соответствуют этим критериям. Так что вы даже можете использовать Export-Excelи при необходимости создать хороший отчет для руководителя.
Да, и я должен упомянуть, что параметр -Name передается через конвейер Get-InactiveUserProfiles , нет необходимости явно указывать его. Вы также можете иметь список компьютеров в текстовом файле и использовать его:
Get-Content C:pathtocomps.txt | Get-InactiveUserProfiles | Where-Object
Как видите создавать свою функцию и свой модуль PowerShell не так уж и сложно, если вы это освоите, то сможете очень многое для себя улучшить. На этом у меня все, с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.
Популярные Похожие записи:
- Установка и управление модулями PowerShell
- Удаление устаревших профилей на RDS ферме
Как запустить скрипт PowerShell в Windows
Как поменять DNS имя подключения к Remote Desktop Services HA
Как открыть PowerShell, все методы
- Как массово поменять пароль локального администратора в домене
Источник: learn.microsoft.com
Функции в Windows PowerShell
В предыдущей статье мы говорили о командлетах в Windows PowerShell. Теперь поговорим о следующем типе команд — функциях.
Функции — это блоки кода на языке PowerShell, имеющие название и находящиеся в памяти до завершения текущего сеанса командной оболочки. Функции в PowerShell это не совсем то же самое, что функции в языках программирования.
Создадим простейшую функцию Primer , которая просто выводит сообщение. Для этого введем в PowerShell
Function Primer
Таким образом мы задали имя функции и выполняемое действие. Теперь, для того, чтобы исполнить функцию, нам достаточно написать её имя.
Функции способны работать с аргументами, которые передаются им при запуске. Сделать это можно с помощью переменной $Args , которая представляет собою массив с аргументами, или при помощи формальных параметров.
Изменим нашу функцию Primer , добавив в неё переменную $Args .
Function Primer
Тогда при вызове функции нам необходимо будет прописать аргумент или аргументы. Внимательно посмотрите на скриншот ниже.
В данном случае «функции», «с» и «аргументами» — три элемента массива $Args . Как видим, они выводятся через пробел. Для того, чтобы убедиться, что это именно три отдельных элемента, введем разделитель в виде точки с помощью специальной переменной $OFS .
Function Primer< >> $OFS=».» >> «Это пример $Args.»> >>
Второй способ обработки аргументов функций в Windows PowerShell это использование формальных параметров. Формальные параметры указываются в круглых скобках после имени функции.
Продолжим наш пример с выводом сообщения. Снова изменим функцию Primer , приведя её к следующему виду
Function Primer ($a, $b, $c)
Результат будет тем же самым.
В данном случае каждый параметр принял значение определенного слова. Но это могут быть и числа, с которыми мы можем производить математические операции.
Создадим функцию Summa , которая складывала бы значения двух аргументов.
Function Summa ($a, $b)