5 мин

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

Практическое введение в PowerShell для начинающих — командлеты, конвейеры, работа с .NET-объектами, реестром и скриптами.

Приди ко мне, брате, в Консоль! — Админ Долгорукий.

Обновление из 2023 года: я написал эту статью 12 лет назад, и внезапно — это моя самая популярная статья. PowerShell обновился за последние годы, теперь он стал PowerShell Core и его можно запускать как на Windows, так и на Linux и macOS. В скриптах появилось много плюшек, но основная идея осталась той же. Если вы только начинаете писать на PowerShell — эта статья для вас.

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

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

Задача этой статьи проста — показать вам малую долю возможностей PS и дать вам концептуальное понимание предмета.

Что такое PowerShell?

Это интерпретатор командной строки. Вы вводите необходимые команды, на экране отображается результат их выполнения. Всё просто. Всё было так со времён DOS и старого доброго UNIX.

Есть два основных отличия от предшественников, которые качественно выделяют PS:

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

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

Если вы используете 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)

Задачи для практики

  1. Сортировка изображений. Написать скрипт, который сортирует изображения по папкам исходя из их размера. Понадобится Where-Object или Foreach-Object.

  2. Простой NMAP. Запустить пинг в цикле и пропарсить результат. Понадобится изучить -le, -ge и работу со строками.

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

  4. Матрица. Поиграться с переменной $host и сделать из синего экрана Матрицу.

Последние версии ПО от Microsoft поддерживают работу в PowerShell — например, SQL PowerShell позволяет сделать ls по записям в любой таблице.

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

Читать дальше

Похожие посты