Написание скриптов powershell

PowerShell Scripts (part 1) — Как надо писать скрипты

Написание скриптов powershell

В статье PowerShell скрипты, модули, профили (введение) я рассказал об общих моментах, когда стоит создать модуль, а когда достаточно обойтись одним файлом со скриптом. Сегодня я более подробно расскажу о скриптах, как их писать и как писать не стоит.

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

-NoProfile -Command Get-VMIntegrationService -VMName * -Name ‘Time Synchronization’ | ? Enabled | Disable-VMIntegrationService -Passthru

Для начала покажу несколько популярных вариантов написания функций.

Основные конструкции:

1. Несколько примеров, как делать можно, но не нужно:

Function welcome ($name = '%UserName%') {“Hello, $name”}

Запускаем без аргументов и видим, что было использовано значение по умолчанию

PS> welcomeHello, %UserName%PS>

Теперь запуск с аргументом:

PS> welcome Saw-FriendshipHello, Saw-FriendshipPS>

Простые функции можно запускать еще так (но не следует):

PS> welcome('Saw-Friendship')Hello, Saw-FriendshipPS>

Не следует потому, что нужно стремиться к единому стилю кода, а этот вариант не работает, если в функцию передается больше одного аргумента

2. Лучше делать так:

Function welcome {param ($name = '%UserName%')”Hello, $name”}

Работает точно так же, поэтому обойдемся без примеров.

Расширенные функции:

Используя конструкцию из последнего листинга, мы можем воспользоваться всеми возможностями расширенных функций.

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

Представим, что нам нужна функция, умножающая 2 числа с проверкой по нескольким критериям:

  1. Числа должны быть целыми
  2. В диапазоне от -1000 до 1000
  3. значение не может быть пустым

Приведу 2 варианта:

Function multiplication {param ($a,$b)if (($a -is [int] -and $b -is [int]) -and($a -ne $null -and $b -ne $null) -and($a -le 1000 -and $b -le 1000) -and($a -ge -1000 -and $b -ge -1000)) {$a * $b} else {Write-Error -Message 'аргументы должны быть целыми числами в диапазоне от -1000 до 1000'}} Function multiplication {[CmdletBinding()]param ([parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][ValidateRange(-1000,1000)][int]$a,[parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][ValidateRange(-1000,1000)][int]$b)$a * $b}

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

Правда пока я писал этот пример, обнаружился забавный нюанс: несмотря на проверку ValidateNotNullOrEmpty, значение может быть и $null и пустой строкой «», но это происходит из-за того, что оба эти варианта замечательно переводятся в тип [INT]

Получается, что даже это будет работать без ошибки

PS> multiplication $null ''0PS>

О том, какие еще конструкции можно использовать, можно узнать, выполнив

Get-Help about_Functions_Advanced_Parameters

или через браузер

Но, как показывает практика, ссылки на MS очень ненадежные

Источник: https://sawfriendship.wordpress.com/2019/03/16/ps_scripts_modules_profiles_1_1/

Примеры PowerShell скриптов для Windows

Написание скриптов powershell

В админиcтрировании всегда есть место творчеству.

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

Что такое PowerShell и чем он хорош

Пользователи UNIX и Linux, а с какого-то мoмента и macOS привыкли к тому, что под рукой всегда есть Bash — немного старомодное, но универсальное и мощное средство, при помощи которого всего парой строк можно творить удивительные вещи. Прописываешь новый скрипт в cron — и готово, он уже крутится на твоем компьютере или на сервере и незаметно делает что-нибудь полезное.

Возвращаясь в Windows (а без этого иногда никак), понимаешь, что скрипты .bat хоть и хороши, но спасают не всегда: очень уж ограниченны их возможности. И если ты до сих пор считал, что PowerShell — это неведомая штуковина, ради которой нужно что-то там поднимaть и настраивать, то не спеши с выводами — он, если разобраться, совсем неплох.

Windows PowerShell — это расширяемое средство автоматизации с открытыми исходниками, которое состоит из оболочки (командной строки) и скриптового языка. Впервые он был показан в 2003 году (тогда он назывался Monad). PowerShell 2.

0 вышел в составе Windows 7 и Windows Server 2008 R2 и с тех пор присутствует в Windows в качестве стандартного компонента. Его даже включили в Windows XP SP3. PowerShell построен на основе .NET Framework и интегрирован с ним.

PowerShell может обращаться к COM, WMI и ADSI, а также, конечно же, исполняет консольные команды.

[ad name=»Responbl»]

В общем, «пошик» имеет крепкие связи с продуктами Microsoft, будь то Active Directory или почтовый сервер Exchange. Это позволяет без подключения к оснастке сервера обращаться к ним через консоль и отдaвать команды.

Если раньше ты не интересовался PowerShell, то, скорее всего, у тебя стоит вторая версия. Я рекомендую обновиться как минимум до третьей — она содержит куда больше возможностей и полезных фишек.

Если не вдаваться в подробности, то в PowerShell 2.0 входит около десятка модулей и примерно 350 команд, а в PowerShell 3.0 уже около 2300 командлетов из более чем 70 модулей.

«Хакер» также писал о том, чем отличается самый новый PowerShell пятой версии из Windows 10.

[ad name=»Responbl»]

Выбираем среду разработки и инструменты

Теперь давай разберемся, где удобнее всего писать код. Можно, конечно, и в «Блокноте», Notepad++ или Sublime. Но это в данном случае не самый грамотный выбор редактора. Лучше всего начинать знакомство с PowerShell, вооружившись идущим в комплекте PowerShell ISE.

PowerShell ISE

Это даже не редактор, а практически полноценная среда разработки. Здесь есть функция IntelliSense, которая позволяет просматривать перечень командлетов и их параметров, переменных, утилит и прочего. Поддерживаются сниппеты, есть возможность расширения нaбора функций за счет различных аддонов. Очень полезно и окно Commands.

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

Тем не менее у PowerShell ISE есть и достойные конкуренты. Один из них — Dell PowerGUI.

PowerGUI — это визуальное дополнение к PowerShell. Оно упрощает сборку собственных сценариев до выбора необходимых командлетов. Берешь то, что нужно для решения задачи, и перетаскиваешь части кода, пока не получишь скрипт.

Одна из главных фишек PowerGUI — это Power Packs, готовые скрипты, опубликованные сообществом пользователей и выложенные в свобoдный доступ. Тут есть и простенькие команды вроде добавления пoльзователей, и сложные — к примеру, управление свитчами и виртуальными машинaми.

Все их легко дополнять и модифицировать в соответствии с нуждами.

powergui

PowerShell Studio 2015 фирмы Sapien — бoлее продвинутая среда, которая рассчитана на совместную разработку одного проекта большим количеством участников.

Если ты когда-нибудь имел дело с Visual Studio, то, думаю, заметишь сходство.

Среди полезных фишек PowerShell Studio — панель Ribbon, поддержка удаленной отладки, а также функции компилятора, которые позволяют включить скрипты в исполняемые файлы. Есть поддержка разных версий PowerShell.

PowerShell Studio 2015

Стоит упомянуть и Script Browser для Windows PowerShell ISE. Это не среда разработки, но вeсьма интересный инструмент, разработанный в Microsoft. Script Browser открывает доступ к базе готовых скриптов, которые можно использовать в качестве образцов для написания своего кода. А еще эта штука умеет анализировать код, который ты пишешь, и подсказывает, как его улучшить.

Script Browser для Windows PowerShel

Несколько полезных трюков

Разобравшись с редактором, можно приступать к написанию кода. PowerShell — несложный язык, и, я думаю, ты быстро разберешься, что к чему. Команды здесь называются командлетами, и каждый из них состоит из двух частей.

Сначала идeт действие, например Get, Set, Add, Invoke, Remove. Затем указывается то, на что действие направлено: Service, VM, AzureAccount, DHCPServerSetting. Каждая часть отделяется от другой дефисом. Получается, к примеру, get-process.

Это, кстати, полезная команда, которая выводит список процессов. Скажем, если написать

get-process BadTh*

увидим что-то такое:

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ——— ——— ——— ——— ——— ——— ——— ——— 28 4 -210844 -201128 -163 25.67 2792 BadThread

Теперь можно завершить зависший процесс:

stop-process -id 2792

Хочешь посмотреть права на директорию? Сделать это помогает такой командлет:

E:>Get-Acl N:Data

Можно проcмотреть рекурсивно, правда уже чуть с более сложной логикой:

E:>Get-ChildItem N:Data -recurse | Get-Acl

Если не можешь понять, что делает какой-то командлет, напиши следующее (заменив Get-Process на название неизвестного командлета):

Get-Help -Name Get-Process

Можно также выполнить

Get-Help -Name Get-*

В этом случае будет выведен весь список возможных вариантов.

Теперь давай попробуем узнать что-нибудь о нашем домене через кoнсоль PowerShell. К примеру, давай посмотрим пользовательские аккаунты, у которых установлен неистекающий пароль:

Search-ADAccount -PasswordNeverExpires | FT Name, ObjectClass, UserPrincipalName

Кстати, к каждому полю в окошке опции учетной записи или компьютера можно обратиться и считать данные. Таким образом можно делать целые срезы. Вот, к примеру, запрос на основе данных о телефонных номерах:

Get-AdUser -Filter * -Properties OfficePhone | FT OfficePhone,UserPrincipalName

PowerShell в сравнении с bat

Иногда задачу можно решить как старым дедовским методом, так и при помощи PowerShell.

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

К тому же ты постепeнно оценишь его синтаксис — более элегантный и консистентный. Вот несколько примеров, как вещи делались раньше и как их можно сделать при помощи PowerShell.

Следующая командная строка перезагрузит компьютер с задержкой в десять секунд:

shutdown /r /m \\SERVER1 /f /t 10

На PowerShell это будет выглядеть вот так:

Start-Sleep 10 Restart-Computer -Force -ComputerName SERVER1

Вот так через bat можно перезагрузить службу dnscache (или любую другую):

sc stop dnscache sc start dnscache

В PowerShell это будет так:

Restart-Service dnscache

Мап диска в bat:

Net use L: \\server1\c$

И в PowerShell:

New-PSDrive -name L -psprovider FileSystem -root \\server1\c$

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

[ad name=»Responbl»]

Удаленное управление с PowerShell

В основном описанные в статье команды выполняются на том же компьютере, на котором они запущены.

Проще говоря, команды для управления AD выполнять нужно на сервере, где контроллер домена и установлен, что, согласиcь, на корню рубит удобство и автоматизацию.

Для выполнения команд удалeнно, что нам и требуется, надо пользоваться специальными командлетами. К пpимеру, для подключения к удаленному компьютеру и перезапуску там спулера пeчати вводи

Enter-PSSession -ComputerName SRV4 Restart-Service -Name spooler

Более подробно читай тут.

Что почитать еще

Книжек и прочих обучающих материалов по PowerShell огромное количество. Есть как справочники, так и учебные туториалы. Начать можно с сайта Microsoft, где есть неплохие видеоуроки.

В деле немало поможет и книга «Master-PowerShell» Тобиаса Велтнера. В ней автор охватывает многие понятия вроде массивов, хеш-таблиц, конвейеров, объектов, функций, обработки ошибок, регулярных выражeний и так далее. Заодно подробно рассматривается XML и разные аспекты администрирования. Увы, на русский эта книга не переведена.

Из русскоязычных мануалов по PowerShell мне попадался «Windows PowerShell 2.0. Справочник администратора» Уильяма Станека — он весьма неплох.

На «Хабрахабре» есть перевод полезной статьи Джеффери Хикса об администрировании Active Directory при помощи PowerShell.

[ad name=»Responbl»]

Итого

Как видишь, все не так сложно, как кажется на первый взгляд. Главное — четко понимать, что нужно на выходе, и на этом основании выбирать командлеты. А с удобным редактором это делaть куда легче. Доступность разнообразных заготовок может заметно упростить решение повседневных задач администрирования. Знания «пошика» прокачаешь по ходу дела, а это в работе с Windows совсем не лишнее.

Источник: https://cryptoworld.su/primery-powershell-skriptov-dlya-windows/

Создание и использований функций PowerShell

Написание скриптов powershell


Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета Pyatilistnik.org. В прошлый раз мы с вами очень подробно разобрали, как производится подключение к удаленному рабочему столу в разных операционных системах.

Сегодня я вам так же хочу упростить жизнь и научить классным возможностям PowerShell.

Мы научимся бороться с рутиной, созданием и использованием функций PowerShell, которые войдут в вашу жизнь так, что вы уже больше не сможете без них представить свое рабочее окружение.

Функция – это список операторов Windows PowerShell, которым присвоено имя. Когда вы запускаете функцию, вы вводите имя функции. Операторы в списке запускаются так, как если бы вы ввели их в командной строке. Я бы сказал: внутри функции вы можете размещать коды, операторы, параметры и так далее. У этой функции есть имя. И это имя используется для запуска вашей функции.

Подробнее об этом можно прочитать в справке 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, например:

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

Как создавать функции в PowerShell

Иногда мне приходится удалять старые профили с серверов, там я использую утилиту delprof2.exe, о которой я подробно уже писал. Там где мне нужна автоматизация, я создал bat-файл и все живет своей жизнью, а для разовых вещей я использую скрипт. Периодически я его теряю или забываю, где он лежит. поэтому я решил превратить его в функцию, которую легко смогу вызывать по ключевому имени.

Итак, обо всем по порядку, нам нужно определить, как мы будем запускать delprof2. Для моей функции я решил, что у меня будет стандартное расположение .exe и сделать его необязательным параметром:

Param ( … [string]$delprof2 = “c:\windows\system32\delprof2.exe” )
Я выбрал system32, потому что это начальный путь по умолчанию для PowerShell с повышенными привилегиями, но выберите то, что вам подходит. Чтобы фактически запустить delprof2, мы теперь используем амперсанд &, который является оператором вызова, например:

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

$output = & $delprof2 '/l'

Получив результат, мы воспользуемся foreachциклом для анализа каждой строки, чтобы увидеть, что она собой представляет. Игнорируемый профиль выглядит так:

Ignoring profile '\\DC01\C$\Users\Default' (reason: special profile)

Нам нужно получить оттуда несколько фрагментов данных. Помимо того факта, что это игнорируемый профиль, я хотел бы собрать имя профиля и причину. Итак, немного магии регулярных выражений, например:

if ($line -match “Ignoring profile \'(?\\\\([\\]+\\)+(?[\']+))\' \(reason\: (?[\)]+)\)”)

Далее, мы можем построить возвращаемый объект:

[pscustomobject]@{ Ignored = $true Reason = $Matches.reason ProfilePath = $Matches.profilePath Profile = $Matches.profile

}

Включенные профили немного проще, дополнительной информации для анализа нет. Итак, регулярное выражение будет выглядеть так:

if ($line -match “(?\\\\([\\]+\\)+(?\S+))”)

Это дает нам больше полезных данных, которые мы можем использовать в возвращаемом объекте:

[pscustomobject]@{ Ignored = $false Reason = $null ProfilePath = $Matches.ProfilePath Profile = $Matches.Profile

}

Поскольку нам действительно нужно иметь возможность определять параметры для этой функции и мы также хотим иметь возможность принимать ввод с некоторыми параметрами. Для 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” }

}

Затем, поскольку мы запускаем его на удаленном компьютере, мы должны проверить возможность подключения, все же вы знакомы с командой ping:

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 = & $delprof2 $computer $switches

Кстати, еще очень удобно использовать функции PowerShell для утилиты robocopy, очень много можно выполнить разных сценариев.

Финальная версия созданной функции PowerShell

Теперь все объединим в единую функцию PowerShell.

Function Get-InactiveUserProfiles { [cmdletbinding()] param ( [Parameter( Position = 1, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true )] [Alias('Computer','ComputerName','HostName')] [ValidateNotNullOrEmpty()] [string]$Name = $env:COMPUTERNAME , [Parameter()] [string[]]$include # Supports ? and * , [Parameter()] [string[]]$exclude # Supports ? and * , [Parameter()] [int]$olderThan , [string]$delprof2 = “c:\windows\system32\delprof2.exe” ) Begin { $switches = & { “/l” if ($include) { foreach ($inc in $include) { “/id:$inc” } } if ($exclude) { foreach ($exc in $exclude) { “/ed:$exc” } } if ($olderThan) { “/d:$olderThan” } } } Process { if ($PSBoundParameters.ContainsKey('Name') -and ($Name -ne $env:COMPUTERNAME)) { if (Test-Connection $Name -Count 1 -Quiet) { $computer = “/c:$Name” } else { Throw “Cannot ping $Name” } } Write-Verbose “CMD: $delprof2 $computer $switches” $return = & $delprof2 $computer $switches foreach ($line in $return) { if ($line -match “Ignoring profile \'(?\\\\([\\]+\\)+(?[\']+))\' \(reason\: (?[\)]+)\)”) { # Ignored profile [pscustomobject]@{ Ignored = $true Reason = $Matches.reason ProfilePath = $Matches.profilePath Profile = $Matches.profile ComputerName = $Name } } elseif ($line -match “(?\\\\([\\]+\\)+(?\S+))”) { # Included profile [pscustomobject]@{ Ignored = $false Reason = $null ProfilePath = $Matches.ProfilePath Profile = $Matches.Profile ComputerName = $Name } } elseif ($line -match “Access denied to profile \'(?\\\\([\\]+\\)+(?[\']+))\'”) { # Access denied [pscustomobject]@{ Ignored = $true Reason = 'Access denied' ProfilePath = $Matches.ProfilePath Profile = $Matches.Profile ComputerName = $Name } } } } End{}

}

Как запускать функцию PowerShell?

Тут два варианта запуска:

  • Если вы не планируете частое использование вашей функции, то вы легко можете ее сохранить в виде скрипта PowerShell с расширением .ps1 и вызывать в нужное время, вот такой командой:
[info]Import-Module C:\Scripts\delprof.ps1 -Force[/info]

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

  • Второй вариант, это создание и использование модуля

Что такое модуль PowerShell?

Модуль – представляет собой набор функциональных возможностей, связанных Windows PowerShell, сгруппированных вместе в качестве удобного инструмента (обычно сохраняется в одном каталоге). Определив набор связанных файлов сценариев, сборок и связанных ресурсов в качестве модуля, вы можете ссылаться, загружать, сохранять и делиться своим кодом намного проще.

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

Узнайте какая у вас версия PowerShell

Например, давным-давно вам нужно было импортировать модуль Active Directory, чтобы использовать команды PowerShell Active Directory. Выглядит это вот так:

Import-Module ActiveDirectory -Verbose

Обратите внимание, сколько разных командлетов импортирует один модуль.

Чтобы показать все модули, которые установлены и могут быть импортированы, запустите

Get-Module -ListAvailable

Модули хранятся в папке

C:\Windows\system32\WindowsPowerShell\v1.0\Modules

  • Папка по умолчанию для модулей, поставляемых с Windows – cd $PSHome\Modules – Не рекомендуется сохранять здесь свой модуль.
  • Папка модулей для всех пользователей – cd $Env:ProgramFiles\WindowsPowerShell\Modules
  • Папка модулей для текущего пользователя – cd $Home\Documents\WindowsPowerShell\Modules

Как сохранить свою функцию как модуль сценария

Откройте PowerShell ISE, щелкните “Файл” и выберите “Сохранить”. Чтобы сделать вашу функцию доступной для всех пользователей, сохраните ее в ProgramFiles\WindowsPowerShell\Modules\Get-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 {Name – 'RDCB*'} | Get-InactiveUserProfiles -Exclude 'Administrator' -OlderThan 10 | Where-Object {-not $_.Ignored}

Это будет список профилей со всех компьютеров, возвращенных в этом запросе к AD, которые не являются профилем Administrator и не были использованы в течение 10 дней.

 Обратите внимание, что я использую командлет Where-Object для фильтрации только тех профилей, которые соответствуют этим критериям.

 Так что вы даже можете использовать Export-Excelи при необходимости создать хороший отчет для руководителя.

Да, и я должен упомянуть, что параметр -Nameпередается через конвейер Get-InactiveUserProfiles, нет необходимости явно указывать его. Вы также можете иметь список компьютеров в текстовом файле и использовать его:

Get-Content C:\path\to\comps.txt | Get-InactiveUserProfiles | Where-Object {-not $_.ignored}

Как видите создавать свою функцию и свой модуль PowerShell не так уж и сложно, если вы это освоите, то сможете очень многое для себя улучшить. На этом у меня все, с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Источник: http://pyatilistnik.org/creating-and-using-powershell-functions/

Первые шаги для пауэршельшиков

Написание скриптов powershell

Приди ко мне брате в Консоль! — Админ Долгорукий. Много ярлыков улетело в корзину со времён выхода в свет 2008 Windows. Люди попроще дивились новому синему окошку, которое ребята из Майкрософт зачем-то вставили в свои новые продукты. Люди, которые сидят на блогах и знают программирование начали изучать это окошко.

В итоге к народу начало приходить осознание того, что Майкрософт действительно разработали что-то новое и интересное. И так, зачем вам это нужно? В основном, программа под названием PowerShell (в дальнейшем PS) предназначена для администраторов и программистов. Она позволяет автоматизировать примерно 99% всех действий в системе.

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

Задача этой статьи проста — показать вам малую долю возможностей PS и дать вам концептуальное понимание предмета. В действительности документации по предмету написано несметное количество, так что я не стремлюсь охватить всё. Я так же ознакомлю вас с набором утилит, которые позволят не вылезать из PS в принципе. Что представляет собой PS? Это интерпретатор командной строки.

Вы вводите необходимые команды, на экране отображается результат их выполнения. Всё просто. Всё было так со времён доса и старого доброго Юникса. Есть два основных отличия от предшественников, которые качественно выделяют PS среди других интерпретаторов.

  • Очень хорошая интеграция с Microsoft .NET Framework. Это даёт вам возможность вплетать мощные программистские решения в свои команды и скрипты.
  • Все значения, возвращаемые вам в терминал являются объектами, с которыми можно работать как с объектами, а не просто набором строк. Это позволяет вам создавать неимоверно мощные программные скрипты.

Приступая к работе

Если вы используете Windows 7 или 2008 то PS вам уже доступен. Для пользователей других версий Windows — добро пожаловать на сайт Майкрософт.

После установки вы можете запустить консоль и настроить её по своему вкусу, нажав на иконку в заголовке окна. Вы можете выбрать шрифт и изменить сам размер окна.

После этого, предпринимайте робкие шаги по выполнению первых команд. Для начала наберите

dir

и вы получите список папок в текущем каталоге. Приятным моментом для любителей Юникса будет тот факт, что команда

ls

работает так же хорошо, как и dir. В PS существует система назначения алиасов на различные команды. В действительности, то что вы сейчас сделали — это выполнили командлет (так в PS называются команды, встроенные в сам PS) Get-ChildItem. Вы можете попробовать просто набрать Get-ChildItem и получить тот же результат, что и в двух предыдущих командах. Для того, чтобы вы быстро ознакомились со списком всех алиасов наберите

ls Alias:\

И так, что-то произошло. Вы начали кое-что понимать. Сейчас я буду раскладывать всю магию по кусочкам. Первое. Командлеты в оригинальной нотации PS имеют следующую систему именования — Глагол-Объект. Это позволяет вам лучше понимать, что можно ожидать в результате выполнения того или иного командлета. Например,

Get-Process # Получить список процессов Remove-Item # Удалить что-то Get-Help # получить справку по чему-то Set-Alias # Создать новый алиас New-Item # Создать новый объект (Объектом может быть всё что угодно, например, файл)

Далее, в PS достаточно много очевидных вещей находится в непривычных для виндузятника местах. В частности, вы можете посмотреть, что за диски есть в вашей системе, набрав команду

Get-PSDrive

И в ответ вы получаете намного более интересный список дисков в вашей системе, нежели тот, что вы видите в «Моём Компьютере» Name Used (GB) Free (GB) Provider Root—- ——— ——— ——– —-Alias AliasC 16.56 63.44 FileSystem C:\cert Certificate \D .11 53.92 FileSystem D:\Env EnvironmentFunction FunctionHKCU Registry HKEY_CURRENT_USERHKLM Registry HKEY_LOCAL_MACHINEVariable VariableWSMan WSMan На диске Alias вы можете увидеть список всех алиясов в системе. Виртуальный диск Variable: хранит в себе все переменные, которые вы можете использовать в данной сессии. На диске Env — лежат переменные операционной системы. Диски HKCU и HKLM являются обёрткой для работы с соответствующими ветками реестра. Давайте углубимся. Набирайте Set-Location HKLM: # Или, если вы из людей подосёвее, набирайте cd HKLM: Ну и как вам новый и невероятный способ хождения по реестру всея машины? Вы можете сделать ls по ветке реестра или перейти в нужный «каталог», набрав cd SYSTEM. SKC VC Name Property— — —- ——– 2 0 BCD00000000 {} 4 0 HARDWARE {} 1 0 SAM {}Get-ChildItem : Requested registry access is not allowed.At line:1 char:3+ ls ps wordpad | ls Directory: C:\Program Files\Windows NT\Accessories Mode LastWriteTime Length Name—- ————- —— —–a— 6/28/2010 9:57 PM 4247040 wordpad.exe Вот это меня поразило до глубины души.

Теперь можно переходить к изучению окружения

Как я уже говорил, всё что вы видите на экране не является строками, а является объектами. Например, результат выполнения команды ps возвращает нам список процессов, запущенных в системе. Но как узнать, что же у нас в руках? Для этого мы воспользуемся командлетом Get-Member, который откроет нам методы любого класса.

Давайте узнаем, что содержится в том же самом процессе, который выдаёт нам команда ps. ps wordpad | Get-Member Набирайте, и смотрите на список членов класса, которые вы можете увидеть в классе System.Diagnostics.Process. Тоесть, фактически, командлет ps вернул нам массив объектов типа Process и мы можем попрограммировать их! Давайте поглумимся над блокнотом.

PS C:\> notepad PS C:\> ps notepad Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ——- —— —– —– —– —— — ———– 70 4 1148 5376 56 0.30 3900 notepad PS C:\> ps notepad | get-member -type method TypeName: System.Diagnostics.Process Name MemberType Definition—- ———- ———-BeginErrorReadLine Method System.

Void BeginErrorReadLine()BeginOutputReadLine Method System.Void BeginOutputReadLine()CancelErrorRead Method System.Void CancelErrorRead()CancelOutputRead Method System.Void CancelOutputRead()Close Method System.Void Close()CloseMainWindow Method bool CloseMainWindow()CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObj…Dispose Method System.

Void Dispose()Equals Method bool Equals(System.Object obj)GetHashCode Method int GetHashCode()GetLifetimeService Method System.Object GetLifetimeService()GetType Method type GetType()InitializeLifetimeService Method System.Object InitializeLifetimeService()Kill Method System.Void Kill()Refresh Method System.

Void Refresh()Start Method bool Start()ToString Method string ToString()WaitForExit Method bool WaitForExit(int milliseconds), Syst…WaitForInputIdle Method bool WaitForInputIdle(int milliseconds),… Вот это неплохое количество методов, которые мы можем запустить, используя шелл. И так, как же это сделать? Просто. (ps notepad).

WaitForExit() Если вы возьмёте результат выполнения командлета в скобки, то вы сможете обратиться к нему, как к объекту в вашей программе, прямо из командной строки. После запуска этого метода шелл завис и ждёт у моря погоды. Нажмите пару раз Enter. Ничего не происходит. Что же, закройте открытый блокнот. Вуаля, вы снова в шелле.

Я думаю, теперь вы должны погулять свою фантазию. Попробуйте, пустите через конвейер в get-member результаты выполнения ls или других командлетов, каких только можете найти. Если вы увидели, что в свойстве какого-то объекта лежит ещё один объект, не стесняйтесь пускать его на Get-Member (ps notepad).StartTime | Get-Member И так далее до бесконечности.

Задача для пытливых умов. Пролетела новость, что рефлектор станет платным. Как сделать рефлектор на чистом PS? Кстати, это не такая уж и трудная задача.
Ну, вот, мы немного разобрались с тем, как узнать, что нас окружает. Теперь, мы готовы к тому, чтобы понять ещё парочку принципов, существующих в шелле.

Переменные и объекты

И так, пару слов по поводу переменных. В PS они бывают нетипизированными: $processList = ps И типизированными PS C:\> [DateTime]$x = “febbrrr”Cannot convert value “febbrrr” to type “System.DateTime”. Error: “The string was not recognized as a valid DateTime. There is a unknown word starting at index 0.

“At line:1 char:13+ [DateTime]$x $client = New-Object System.Net.WebClientC:\> $client.DownloadString(“http://google.com”) А вот это уже другое дело. Только что мы из подручных средств собрали себе wget на коленке. Как вам такой поворот событий? Что же, в этот момент можно идти в MSDN и подряд перебирать все классы, смотреть, что в них есть интересного.

Всё это позволяет создавать очень гибкие скрипты.

Кстати, о скриптах

PS позволяет выполнять скрипты. Ура! Делает он это с волшебного пендаля. Неура. По умолчанию в PS запрещён запуск скриптов, которые не были подписаны цифровой подписью. Для запуска скрипта вы должны его либо подписать (для этого используйте help about_signing) либо, просто понизить уровень безопасности, и выполнить set-executionpolicy remotesigned обычно я делаю второе.

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

Для начала, рекомендую создать для него файл: New-Item -type file $PROFILE Переменная $PROFILE содержит в себе адрес файла с вашим профилем в PS. Этот файл будет запускаться в тот момент, когда вы стартуете PS. Плюс заключается в том, что вы можете нашпиговать свой профиль разными мелкими и полезными скриптами, которые помогут вам автоматизировать производство.

Теперь вы можете начать редактирование своего профиля: vim $PROFILE (О, кстати, я вам не сказал, но в PS, на мой взгляд, лучше всего смотрится текстовый редактор vim. Возможно кто-то назовёт меня настоящим извращенцем, но на самом деле, я уже не раз пытался использовать что-то другое, но всегда возвращался к виму. Попробуйте и вы.

Его не просто изучить с нуля, но если вы поймёте основы, то сможете очень быстро и удобно редактировать тексты.) Ладно, теперь повторим эту команду без того, чтобы умничать: notepad $PROFILE Ну, вот, например, то, что лежит у меня в профиле $webClient = New-Object System.Net.WebClient$cred = New-Object System.Net.NetworkCredential(“login”, “Pass”)$webClient.

Proxy = New-Object System.Net.WebProxy(“www.proxy.adrress”, $true, $null, $cred) Так как мы используем прокси сервер, а вэб клиент является моим любимым инструментом для работы, то я уже заготовил для себя переменную с этим клиентом, чтобы иметь возможность безболезненно подключаться к интернету и не отягощать себя вводом пароля. Что ещё можно запихнуть в профиль? Всё что угодно.

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

Моей задачей было предоставить вам возможность получить общее представление о том, что вы можете сделать.

Что же, вот, напоследок, вам задачи, над которыми можно поломать голову и решить интересные проблемы: Написать скрипт, который сортирует изображения по папкам, исходя из их размера (для получения размера файла можно использовать дотнет объекты или ком объекты, предоставляемые эксплорером) Для выполнения этого, вам уж точно понадобиться хорошо изучить Where-Object или Foreach-Object.

Написать простой NMAP Что будет, если запустить команду Пинг в цикле? А теперь, возьмите выход от этой команды и пропарсите его как строку. Вам однозначно придётся прочитать мануал по -le -ge и том, как работать со строками. Написать парсер для башорга. Чтобы, после логина в систему, вам на выбор выдавалась цитата из лучших за последние пять лет.

Тут можно использовать регэкспы, с которыми PS очень хорошо дружит. Поиграться с переменной $host и сделать из синего экрана Матрицу! Что ещё можно делать? Матёрые COM программисты найдут для себя отличный способ повеселиться, когда обнаружат, что new-object имеет ключ -comObject.

Фактически, это открывает вам ворота к полному управлению практически любой функцией локального и удалённого компьютера. Ещё хочу заметить, что последние версии программного обеспечения от Microsoft поддерживают работу в PowerShell. Например, есть SQL PowerShell, который поставляется с 2008 сиквелом и позволяет сделать ls по записям в любой таблице.

Это даёт ещё больший простор для фантазий. Так же, хочу заметить, что комьюнити по разработке на PS очень сильно растёт и ширится. В частности, вы можете найти скрипты, готовые для чего угодно — например, вы можете нагуглить себе способ управления ITunes через PowerShell или способ использования Google Desktop Search в PS.

Что же, мой неинтересующийся друг, надеюсь, я дал тебе что-то интересное, и ты теперь возьмёшься за покорение интерпретатора, который действительно поможет тебе упростить твою нелёгкую программерскую жизнь и даст тебе возможность автоматизировать больше и быстрее. Очень приятно, что ты прочитал мою статью. Спасибо большое, я могу продолжать конкретно описывать определённые области, если вдруг тебе станет очень интересно.

  • powershell
  • .NET
  • скрипт
  • шелл

Хабы:

Источник: https://habr.com/ru/post/113913/

Написание и запуск скриптов в PowerShell

Написание скриптов powershell

Программа PowerShell — это альтернативная командная строка с обширной функциональностью. Многие владельцы компьютеров, которые неплохо ориентируются в системных процессах, интересуются возможностями её использования на Windows 10 и предыдущих версиях этого обеспечения, чтобы менять конкретные процессы и настройки ПК под себя.

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

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

Как открыть PowerShell?

Это можно сделать несколькими следующими способами:

  • Через Пуск — вы найдёте приложение в общем списке компонентов под буквой W.
  • При помощи поиска в Панели задач — откройте её, и введите слово PowerShell для поиска.
  • Используя меню «Выполнить» — запустите его через комбинацию Win+R и напишите название утилиты, после чего она будет найдена в системе.
  • В коммандере задайте действие PowerShell — но, вы должны знать, что будете работать с приложением через уже запущенную строку, а не в отдельном окне.
  • В параметрах Windows выберите «Свойства панели задач» и меню «Пуск». Во вкладке «Навигация» поставьте флажок на строке «Заменить командную строку оболочкой PowerShell…». Теперь вы сможете включать утилиту комбинацией Win+X.

Как писать и запускать скрипты?

Как создать скрипт PowerShell и запустить его? Это можно попросту сделать в блокноте — используя его, укажите в новом документе необходимые вам команды. После сохраните его, но поменяйте формат на .ps1 — именно такое расширение имеют файлы этой системной утилиты.

Писать скрипты в самом приложении можно так:

  • Запустите его.
  • Нажмите на пункт «Создать».
  • Или кликните на «Файл», и в появившемся списке выберите «Создать».
  • Напишите все команды, которые нужно выполнить, сохраните файл.

Скрипты ещё можно писать и редактировать в FAR Manager, но их нельзя использовать непосредственно в таком приложении, ведь оно отображает файлы этого типа через стандартную строку cmd. Однако прочие действия выполняются таким же образом, как и в «родной» утилите.

Запустить скрипт вы сможете таким образом:

  1. Зайдите в PowerShell от имени администратора.
  2. При помощи команд cd укажите месторасположение требуемого файла. Например, e: cd\ cd work .\ имя_файла. Ps1, или e: \work\ имя_файла.ps1
  3. В этом случае e: — имя жёсткого диска, где находится файл.
  4. Жмите Enter.

Программа обязательно покажет вам сообщение с текстом «Не удаётся загрузить файл ___ .Ps1, так как выполнение скриптов запрещено для этой системы…», когда вы будете первый раз запускать команду.

Дело в том, что Windows оснащён защитой от вмешательства благодаря разработчикам, поэтому никто из пользователей по умолчанию не имеет доступа на выполнение таких действий.

Но, это ограничение можно очень просто обойти.

Как? В тексте, возникающем вместе с ошибкой, будет рекомендация ввести команду get-help about_signing, чтобы получить больше информации. Вы можете выполнить эти указания, или использовать комбинацию Set-ExecutionPolicy remotesigned — после её ввода потребуется подтверждение, и ограничение будет снято.

Другие вопросы по пользованию

У многих возникает вопрос, как узнать версию PowerShell? Для этого выполните следующее:

  1. Откройте приложение.
  2. Введите $PSVersionTable.
  3. Если это ни к чему не привело, значит, у вас версия 1.0 — для неё есть команда $host.version.
  4. В ином случае появится подробная информация о том, какая версия приложения установлена на ПК.

Ещё один вопрос, на который стоит дать ответ — как удалить PowerShell? Для этого потребуются такие действия:

  • Зайдите через Панель управления в меню установки и удаления программ.
  • Найдите ветку Microsoft Windows
  • Удалите обновление для компонента WindowsPowerShell (TM), следуйте инструкциям системы.

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

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

Посоветуем только быть аккуратным при выполнении всех подобных действий, чтобы не навредить компьютеру в целом.

Источник: https://nastroyvse.ru/programs/review/kak-pisat-i-zapuskat-skripty-powershell.html

Все лайфхаки
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: