Первые шаги для пауэршельщиков
Практическое введение в PowerShell для начинающих — командлеты, конвейеры, работа с .NET-объектами, реестром и скриптами.
Приди ко мне, брате, в Консоль! — Админ Долгорукий.
Обновление из 2023 года: я написал эту статью 12 лет назад, и внезапно — это моя самая популярная статья. PowerShell обновился за последние годы, теперь он стал PowerShell Core и его можно запускать как на Windows, так и на Linux и macOS. В скриптах появилось много плюшек, но основная идея осталась той же. Если вы только начинаете писать на PowerShell — эта статья для вас.
Много ярлыков улетело в корзину со времён выхода Windows Server 2008. Люди попроще дивились новому синему окошку, которое ребята из Microsoft зачем-то вставили в свои новые продукты. Люди, которые сидят на блогах и знают программирование, начали изучать это окошко. В итоге к народу начало приходить осознание того, что Microsoft действительно разработали что-то новое и интересное.
Итак, зачем вам это нужно? В основном программа под названием PowerShell (далее PS) предназначена для администраторов и программистов. Она позволяет автоматизировать примерно 99% всех действий в системе. С помощью неё вы можете настраивать удалённые компьютеры, запускать и перезапускать сервисы и производить обслуживание большинства серверных приложений. Возможности у программы потрясающие.
Задача этой статьи проста — показать вам малую долю возможностей PS и дать вам концептуальное понимание предмета.
Что такое PowerShell?
Это интерпретатор командной строки. Вы вводите необходимые команды, на экране отображается результат их выполнения. Всё просто. Всё было так со времён DOS и старого доброго UNIX.
Есть два основных отличия от предшественников, которые качественно выделяют PS:
- Интеграция с .NET Framework. Это даёт вам возможность вплетать мощные программистские решения в свои команды и скрипты.
- Все возвращаемые значения являются объектами, с которыми можно работать как с объектами, а не просто набором строк. Это позволяет создавать неимоверно мощные скрипты.
Приступая к работе
Если вы используете Windows 7 или 2008, то PS вам уже доступен. После установки запустите консоль и настройте её по своему вкусу. Предпринимайте робкие шаги — для начала наберите:
dir
Вы получите список папок в текущем каталоге. Приятный момент для любителей UNIX — команда ls работает так же хорошо. В PS существует система назначения алиасов на различные команды. В действительности вы выполнили командлет 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 Alias
C 16.56 63.44 FileSystem C:\
cert Certificate \
D .11 53.92 FileSystem D:\
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
На диске Alias: — все алиасы. На Variable: — все переменные сессии. На Env: — переменные ОС. Диски HKCU и HKLM — обёртка для работы с реестром.
Попробуйте:
Set-Location HKLM: # Или просто: cd HKLM:
Невероятный способ хождения по реестру! Вы можете делать ls по веткам реестра или переходить в нужный «каталог» через cd SYSTEM.
Обучение в PowerShell
Самая важная команда:
Get-Help # или алиас: help
Microsoft отлично позаботились о документации для программистов. Выбирайте приглянувшийся командлет и отправляйте его в help. Для примеров:
Get-Help New-Item -Examples
Ключ -Examples обычно выдаёт от двух до пяти потрясающих примеров с детальным описанием.
Если не знаете название функции, но предполагаете о её существовании:
Get-Help files
Get-Help Registry
Полезные горячие клавиши
Для новичков:
- Стрелки вверх/вниз — прокрутка истории команд
- Стрелка вправо в конце строки — посимвольный набор предыдущей команды
Для продвинутых:
Ctrl+Home— удалить от курсора до начала строкиCtrl+End— удалить от курсора до конца строкиF7— окно со списком набранных команд- Выделить мышью + Enter — копирование в буфер
- Правая кнопка мыши — вставка из буфера
Конвейер
Когда вы запускаете командлет, возвращаемые значения преобразуются в текст и выводятся на экран. Но можно передать результат одного командлета на вход другого через | (конвейер):
ls -filter "*.bat" | Get-Content
Конвейер может решить проблему «простыни помощи»:
Get-Help Registry | Set-Content reg.txt
А вот настоящая магия:
ps | ls
Если хотите узнать, из какого файла появился процесс — пустите его конвейером на Get-ChildItem:
ps wordpad | ls
Результат:
Directory: C:\Program Files\Windows NT\Accessories
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 6/28/2010 9:57 PM 4247040 wordpad.exe
Объекты и Get-Member
Всё, что вы видите на экране, не является строками — это объекты. Чтобы узнать, что у нас в руках, используем Get-Member:
ps wordpad | Get-Member
Вы увидите полный список членов класса System.Diagnostics.Process. Командлет ps вернул нам массив .NET-объектов, и мы можем работать с ними:
(ps notepad).WaitForExit()
Если взять результат командлета в скобки, можно обратиться к нему как к объекту прямо из командной строки. Шелл «зависнет» и будет ждать. Закройте блокнот — и вы снова в шелле.
Попробуйте пускать через конвейер в Get-Member результаты разных командлетов:
(ps notepad).StartTime | Get-Member
И так далее до бесконечности.
Переменные
В PS переменные бывают нетипизированными:
$processList = ps
И типизированными:
[DateTime]$x = "02/14/11"
$x
# Monday, February 14, 2011 12:00:00 AM
Работа с .NET
Помните, что в PS всё возвращаемое — это .NET-объект? Мы можем создать любой объект из CLR:
$client = New-Object System.Net.WebClient
$client.DownloadString("http://google.com")
Только что мы из подручных средств собрали себе wget на коленке. Можно идти в MSDN и перебирать классы — всё это позволяет создавать очень гибкие скрипты.
Скрипты
PS позволяет выполнять скрипты, но по умолчанию запуск неподписанных скриптов запрещён. Чтобы понизить уровень безопасности:
Set-ExecutionPolicy RemoteSigned
Создайте файл профиля — он будет запускаться при старте PS:
New-Item -type file $PROFILE
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.address", $true, $null)
Задачи для практики
-
Сортировка изображений. Написать скрипт, который сортирует изображения по папкам исходя из их размера. Понадобится
Where-ObjectилиForeach-Object. -
Простой NMAP. Запустить пинг в цикле и пропарсить результат. Понадобится изучить
-le,-geи работу со строками. -
Парсер цитат. Чтобы после логина выдавалась случайная цитата. Можно использовать регулярные выражения, с которыми PS отлично дружит.
-
Матрица. Поиграться с переменной
$hostи сделать из синего экрана Матрицу.
Последние версии ПО от Microsoft поддерживают работу в PowerShell — например, SQL PowerShell позволяет сделать ls по записям в любой таблице.
Надеюсь, я дал вам что-то интересное, и вы теперь возьмётесь за покорение интерпретатора, который действительно поможет упростить вашу нелёгкую программерскую жизнь.
Читать дальше
Похожие посты
Страх и ненависть в протоколе RDP
Как протокол RDP менялся за последние десять лет: версии от NT 4.0 до десятки, полезные флаги mstsc, теневые подключения, дыры в безопасности и будущее администрирования Windows.
Как научиться работать в Blazor, делая что-то полезное. Часть II
Вторая часть о Blazor: подводные камни WASM-бинарников, ловушки Razor, проблемы с общением компонентов, жизненный цикл и состояние экосистемы.
Как научиться работать в Blazor, делая что-то полезное. Часть I
Первая часть о том, как вместо очередного ToDo-листа написать на Blazor полезную систему управления IoT-реле: Entity Framework, MVC-контроллер, серверный рендеринг и C# вместо JavaScript.