Часть 0. Что было до PowerShell?
В 1981 году вышел MS-DOS 1.0. с командным интерпретатором COMMAND.COM. Для автоматизации задач использовались **пакетные файлы (.bat)** — простые текстовые файлы с последовательностью консольных команд. Удивительный аскетизм командной строки на фоне POSIX совместимых систем где уже с 1979 года существовала **оболочка Борна (sh)**.
📅 Состояние рынка оболочек на момент выхода **MS-DOS 1.0** (август 1981)
Вот сводная таблица популярных ОС того времени и их поддержки оболочек (sh, csh и др.):
| Операционная система | Поддержка оболочек (sh, csh, др.) | Комментарий |
|---|---|---|
UNIX Version 7 (V7) | sh | Последний классический UNIX Bell Labs, широко распространён |
UNIX/32V | sh, csh | Версия UNIX для архитектуры VAX |
4BSD / 3BSD | sh, csh | Университетская ветка UNIX от Berkeley |
UNIX System III | sh | Первая коммерческая версия от AT&T, предшественник System V |
Xenix (от Microsoft) | sh | Лицензированная версия UNIX, продавалась Microsoft с 1980 г. |
IDRIS | sh | UNIX-подобная ОС для PDP-11 и Intel |
Coherent (Mark Williams) | sh (похожая) | Недорогая альтернатива UNIX для ПК |
CP/M (Digital Research) | ❌ (Нет sh, только простейший CLI) | Не UNIX, самая популярная ОС для 8-битных ПК |
MS-DOS 1.0 | ❌ (только COMMAND.COM) | Минимальная командная оболочка, никаких скриптов или pipe |
💡 Что такое 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 и т.п.)] без функций, циклов и модулей. Были и внешние команды — отдельные исполняемые файлы (.exe или .com). Примеры: FORMAT.COM, XCOPY.EXE, CHKDSK.EXE, EDIT.COM. Сценарии исполнения записывались в текстовый файл с расширением .bat (batch file)
Примеры конфигуарционных файлов:
AUTOEXEC.BAT
:: ------------------------------------------------------------------------------
:: AUTOEXEC.BAT — Автоматическая конфигурация и запуск Windows 3.11
:: Автор: hypo69
:: Год: примерно 1993
:: Назначение: Выполняет инициализацию DOS-среды, загрузку сетевых драйверов и запуск Windows 3.11
:: ------------------------------------------------------------------------------
@ECHO OFF
:: Настройка приглашения командной строки
PROMPT $p$g
:: Установка переменных среды
SET TEMP=C:\TEMP
PATH=C:\DOS;C:\WINDOWS
:: Загрузка драйверов и утилит в верхнюю память
LH C:\DOS\SMARTDRV.EXE :: Дисковый кэш
LH C:\DOS\MOUSE.COM :: Драйвер мыши
:: Загрузка сетевых служб (актуально для Windows for Workgroups 3.11)
IF EXIST C:\NET\NET.EXE LH C:\NET\NET START
:: Автоматический запуск Windows
WIN
CONFIG.SYS
:: ------------------------------------------------------------------------------
:: CONFIG.SYS — Конфигурация памяти и драйверов DOS для Windows 3.11
:: Автор: hypo69
:: Год: примерно 1993
:: Назначение: Инициализация драйверов памяти, настройка системных параметров
:: ------------------------------------------------------------------------------
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE NOEMS
DOS=HIGH,UMB
FILES=40
BUFFERS=30
DEVICEHIGH=C:\DOS\SETVER.EXE
В Майкрософт параллельно DOS почти сразу начали разрабатывать принциально новое ядро.
Ядро Windows NT (New Technology) впервые появилось с релизом операционной системы:
Windows NT 3.1— 27 июля 1993 года
- Разработка началась: в **1988 году** под руководством **Дейва Катлера** (бывшего инженера
DEC, создателяVMS) с целью создать полностью новую, защищённую, переносимую и многозадачнуюОС, не совместимую сMS-DOSна уровне ядра. NT 3.1— называлась так, чтобы подчеркнуть совместимость с **Windows 3.1** на уровне интерфейса, но была **совершенно новой архитектурой**.
🧠 Что принесло ядро NT:
| Особенность | Описание |
|---|---|
| 32-битная архитектура | В отличие от MS-DOS и Windows 3.x, которые были 16-битными. |
| Многозадачность | Настоящая preemptive multitasking. |
| Защищённая память | Программы не могли повредить память друг друга. |
| Модульность | Многоуровневая архитектура ядра: HAL, Executive, Kernel, драйверы. |
| Поддержка многоплатформенности | NT 3.1 работала на x86, MIPS и Alpha. |
Совместимость с POSIX | NT поставлялся с **POSIX-сабсистемой**, сертифицированной по POSIX.1. |
📜 Линейка NT:
Версия NT | Год | Комментарий |
|---|---|---|
NT 3.1 | 1993 | Первый релиз NT |
NT 3.5 / 3.51 | 1994–1995 | Улучшения, оптимизация |
NT 4.0 | 1996 | Интерфейс Windows 95, но ядро NT |
Windows 2000 | 2000 | NT 5.0 |
Windows XP | 2001 | NT 5.1 |
Windows Vista | 2007 | NT 6.0 |
Windows 10 | 2015 | NT 10.0 |
Windows 11 | 2021 | Тоже NT 10.0 (маркетинг 😊) |
Разница в возможностях операционных систем:
| Характеристика | **MS-DOS** (1981) | **Windows NT** (1993) |
|---|---|---|
| Тип системы | Монолитная, однозадачная | Микроядерная/гибридная, многозадачная |
| Разрядность | 16-бит | 32-бит (с поддержкой 64-бит с NT 5.2 / XP x64) |
| Многозадачность | ❌ Отсутствует (один процесс за раз) | ✅ Preemptive multitasking |
| Защищённая память | ❌ Нет | ✅ Да (каждый процесс в своём адресном пространстве) |
| Многопользовательский режим | ❌ Нет | ✅ Частично (в NT Workstation/Server) |
Совместимость с POSIX | ❌ Нет | ✅ Встроенная POSIX-сабсистема в NT 3.1–5.2 |
| Переносимость ядра | ❌ Только x86 | ✅ x86, MIPS, Alpha, PowerPC |
| Драйверы | Прямой доступ к оборудованию | Через HAL и Kernel-mode Drivers |
| Уровень доступа приложений | Приложения = системный уровень | Пользовательский / Ядерный уровень разделены |
| Безопасность | ❌ Отсутствует | ✅ Модель безопасности: SID, ACL, токены доступа |
| Стабильность | ❌ Зависимость одной программы = крах ОС | ✅ Изоляция процессов, защита ядра |
Но было одно большое НО! Но средствам автоматизации и администрирования не уделялось должного внимание вплоть до 2002 года.
Microsoft использовала совершенно разные подходы, стартегии и инструменты для администрирования. Всё это было **разрозненным**, часто GUI-ориентированным и не всегда автоматизируемым.
📌 Список некоторых инструментов:
| Средство | Назначение |
|---|---|
cmd.exe | Улучшенный командный интерпретатор (замена COMMAND.COM) |
.bat, .cmd | Скрипты командной строки |
Windows Script Host (WSH) | Поддержка VBScript и JScript для автоматизации |
reg.exe | Управление реестром из командной строки |
net.exe | Работа с пользователями, сетью, принтерами |
sc.exe | Управление службами |
tasklist, taskkill | Управление процессами |
gpedit.msc | Групповая политика (локально) |
MMC | Консоль со снап-инами для управления |
WMI | Доступ к системной информации (через wmic, VBScript, или COM) |
WbemTest.exe | GUI для тестирования WMI-запросов |
eventvwr | Просмотр журналов событий |
perfmon | Мониторинг ресурсов |
🛠 Примеры автоматизации:
VBScript-файлы (*.vbs) для администрирования пользователей, сетей, принтеров и служб.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"
Часть 1. PowerShell
Только в 2002 году в компании сформулировался проект Monad , который позже вылился в powershell:
Начало разработки: ориентировочно в 2002 году
Публичное анонсирование: 2003 год, как «Monad Shell«
Первые бета-версии: появились к 2005 году
Финальный релиз (PowerShell 1.0): ноябрь 2006 года
Автором и главным архитектором проекта Monad / PowerShell является Джеффри Сновер (Jeffrey Snover)
Сегодня PowerShell Core работает на
Windows
macOS
Linux
Параллельно шла разработка фреймворка .NET и powershell был в нее глубоко интегрирован, в следующих главах я покажу примеры
А теперь — самое главное!
Главное преимущество PowerShell по сравнению с классическими командными оболочками — это то, что он работает с объектами, а не с текстом. Когда вы выполняете команду, она возвращает вам не просто текст, а структурированный объект (или коллекцию объектов), у которого есть четко определенные свойства (Properties) и методы (Methods).
Смотрите, как PowerShell превосходит классические оболочки благодаря **работе с объектами**
📁 Как было: dir и ручной парсинг
В **CMD** (и в старом COMMAND.COM, и в cmd.exe) команда dir возвращает результат как обычный текст. Пример вывода:
24.07.2025 21:15 1 428 my_script.js
25.07.2025 08:01 3 980 report.html
Допустим, вы хотите извлечь **имя файла** и **размер** каждого файла. Вам придётся парсить строки вручную:
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
Результат:
Name Length
---- ------
my_script.js 1428
report.html 3980
Get-ChildItemвозвращает **массив объектов файлов/папок**Select-Objectпозволяет легко получить нужные **свойства**
🔍 Что на самом деле возвращает Get-ChildItem?
$item = Get-ChildItem -Path .\my_script.js
$item | Get-Member
Результат:
TypeName: System.IO.FileInfo
Name MemberType Definition
---- --------- ----------
Length Property long Length {get;}
Name Property string Name {get;}
CreationTime Property datetime CreationTime {get;set;}
Delete Method void Delete()
...
PowerShell возвращает **объекты типа System.IO.FileInfo**, у которых есть:
- 🧱 Свойства (
Name,Length,CreationTime,Extension, …) - 🛠 Методы (
Delete(),CopyTo(),MoveTo()и т.д.)
Вы работаете **с полноценными объектами**, а не со строками.
Синтаксис «Глагол-Существительное»:
PowerShell использует **строгий и логичный синтаксис команд**:Глагол-Существительное (Verb-Noun)
| Глагол | Что делает |
|---|---|
Get- | Получить |
Set- | Установить |
New- | Создать |
Remove- | Удалить |
Start- | Запустить |
Stop- | Остановить |
| Существительное | Над чем работает |
|---|---|
Process | Процесс |
Service | Служба |
Item | Файл/папка |
EventLog | Журналы событий |
Computer | Компьютер |
🔄 Примеры:
| Что нужно сделать | Команда |
|---|---|
| Получить процессы | Get-Process |
| Остановить службу | Stop-Service |
| Создать новый файл | New-Item |
| Получить содержимое папки | Get-ChildItem |
| Удалить файл | Remove-Item |
➡ Даже если вы **не знаете точной команды**, вы можете **предположить** её по смыслу — и почти всегда угадаете.
Командлет Get-Help — ваш главный помощник.
- Получим справку о самой справке:
Get-Help Get-Help - Получим базовую справку о команде для работы с процессами:
Get-Help Get-Process - Посмотрим примеры использования этой команды:
Get-Help Get-Process -ExamplesЭто невероятно полезный параметр, который часто дает готовые решения для ваших задач. - Получим максимально подробную информацию о команде:
Get-Help Get-Process -Full
В следующей части: конвеер или цепочка команд (PipeLines)