Философия PowerShell. Части 0,1 Вступление и первый командлет
Часть 0.
Что было до PowerShell?
В 1981 году вышел MS-DOS 1.0. с командным интерпретатором COMMAND.COM. Для автоматизации задач использовались пакетные файлы (.bat) — простые текстовые файлы с последовательностью консольных команд. Удивительный аскетизм командной строки на фоне POSIX совместимых систем где уже с 1979 года существовала оболочка Борна (sh).
Состояние рынка оболочек на момент выхода MS-DOS 1.0 (август 1981)
Что такое sh, csh
sh — Bourne Shell, основной скриптовый интерпретатор UNIX с 1977 года.
csh — C Shell, улучшенная оболочка с синтаксисом, похожим на C, и удобствами для интерактивной работы.
Эти оболочки поддерживали редиректы, пайпы, переменные, функции и условия — всё, что сделало UNIX мощным инструментом автоматизации.
Microsoft ориентировалась на дешёвые 16-битные IBM PC, которые имели мало памяти (обычно 64–256 КБ),не имели многозадачности и были предназначены для домашнего и офисного использования, а не серверов. UNIX был платным, требовал сложной архитектуры и опыта, а бухгалтеры и инженеры, не системные админы, им требовалась быстрая и простая ОС
Интерфейс DOS Вместо сложного sh представлял один файл command.com с скудным набором внутренних команд (dir, copy, del и т.p.) без функций, циклов и модулей.
Были и внешние команды — отдельные исполняемые файлы (.exe или .com). Примеры: FORMAT.COM, XCOPY.EXE, CHKDSK.EXE, EDIT.COM. Сценарии исполнения записывались в текстовый файл с расширением .bat (batch file)
Примеры конфигуарционных файлов:
AUTOEXEC.BAT
CONFIG.SYS
В Майкрософт было понятно, что DOS тупиковая ветвь и они почти сразу начали разрабатывать принциально новое ядро.
Ядро Windows NT(New Technology) впервые появилось с релизом операционной системы:
Windows NT 3.1 — 27 июля 1993 года
Разработка началась: в 1988 году под руководством Дейва Катлера (бывшего инженера DEC, создателя VMS) с целью создать полностью новую, защищённую, переносимую и многозадачную ОС, не совместимую с MS-DOS на уровне ядра.
NT 3.1 — называлась так, чтобы подчеркнуть совместимость с Windows 3.1 на уровне интерфейса, но была совершенно новой архитектурой.
Что принесло ядро NT:
Линейка NT:
Ядро NT было хорошим, годным продуктом от Майкрософт, если бы не одно большое «НО!»
Но средствам автоматизации и администрирования не уделялось должного внимание вплоть до 2002 года.
Microsoft использовала совершенно разные подходы, стратегии и инструменты для администрирования. Всё это было разрозненным, часто GUI-ориентированным и не всегда автоматизируемым.
Список некоторых инструментов:
Инструменты автоматизации
VBScript-файлы (*.vbs) для администрирования пользователей, сетей, принтеров и служб. Привет✋ вирус "ILOVEYOU"
WMIC — командный интерфейс к WMI (например: wmic process list brief).
.cmd скрипты с вызовами net, sc, reg, wmic, и т.д.
Windows Scripting Host (WSH)
Впервые появился в Windows 98, активно использовался в Windows 2000 и XP.
Позволял выполнять VBScript и JScript-файлы из командной строки:
> Set objShell = WScript.CreateObject(«WScript.Shell»)
> objShell.Run «notepad.exe»
HTA (HTML Applications)
Чистое шаманство. Если кратко, то это приложения, написанные на HTML и скриптах (чаще всего VBScript или JScript), которые запускались с полноценным GUI и имели полный доступ к Windows через WSH — без ограничений, как обычные сайты в браузере.
Часть 1.
Только в 2002 году в компании сформулировался проект Monad , который позже вылился в powershell:
Начало разработки: ориентировочно в 2002 году
Публичное анонсирование: 2003 год, как «Monad Shell»
Первые бета-версии: появились к 2005 году
Финальный релиз (PowerShell 1.0): ноябрь 2006 года
Автором и главным архитектором проекта Monad / PowerShell является Джеффри Сновер (Jeffrey Snover)
Параллельно шла разработка фреймворка .NET и powershell был в нее глубоко интегрирован, в следующих частях я покажу примеры
А теперь — самое главное!
Главное преимущество PowerShell по сравнению с классическими командными оболочками — это то, что он работает с объектами, а не с текстом. Когда вы выполняете команду, она возвращает вам не просто текст, а структурированный объект (или коллекцию объектов), у которого есть четко определенные свойства (Properties) и методы (Methods).
Смотрите, как PowerShell элегантно решает задачу благодаря работе с объектами
Как было: dir и ручной парсинг
В CMD (и в старом COMMAND.COM, и в cmd.exe) команда dir возвращает результат работы как обычный текст. Пример вывода:
Допустим, вы хотите извлечь имя файла и размер каждого файла. Вам придётся парсить строки вручную:
for /f "tokens=5,6" %a in ('dir ^| findstr /R "[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]"') do @Echo %a %b
Это страшно сложно читается, зависит от локали, формата даты, шрифта. И ломается при пробелах в названиях
PowerShell: объекты вместо текста
Простой и читаемый пример:
> Get-ChildItem | Select-Object Name, Length
Результат:
Get-ChildItem возвращает массив объектов файлов/папок
Select-Object позволяет легко получить нужные свойства
Что на самом деле возвращает Get-ChildItem?
> $item = Get-ChildItem -Path .\11.md
> $item | Get-Member
Результат:
PowerShell возвращает объекты типа System.IO.FileInfo, у которых есть:
Свойства (Name, Length, CreationTime, Extension, …)
Методы (Delete(), CopyTo(), MoveTo() и т.д.)
Вы работаете с полноценными объектами, а не со строками.
Синтаксис «Глагол-Существительное»:
PowerShell использует строгий и логичный синтаксис команд:
Глагол-Существительное (Verb-Noun)
Существительное
Даже если вы не знаете точной команды, вы можете предположить её по смыслу — и почти всегда угадаете.
Командлет Get-Help — ваш главный помощник.
Получим справку о самой справке:
> Get-Help Get-Help
Получим базовую справку о команде для работы с процессами:
> Get-Help Get-Process
Посмотрим примеры использования этой команды:
> Get-Help Get-Process -Examples
Если файл `help` не найден в системе — получим такое сообщение:
Решение:
> Update-Help
Для одного языка:
> Update-Help -UICulture en-US
`-Examples` это невероятно полезный параметр, который часто дает готовые решения для ваших задач.
Получим максимально подробную информацию о команде:
> Get-Help Get-Process -FullВ следующей части: конвеер или цепочка команд (PipeLines)
Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀