Перейти к содержимому

Философия PowerShell. Части 0,1 Вступление и первый командлет

  • hypo69 

Часть 0.

Что было до PowerShell? в 1981 году вышел MS-DOS 1.0. с командным интерпретатором COMMAND.COM. Для автоматизации задач использовались пакетные файлы (.bat) — простые текстовые файлы с последовательностью консольных команд. Удивительный аскетизм командной строки на фоне POSIX совместимых систем где уже с 1979 года существовала оболочка Борна (sh).

📅 Состояние рынка оболочек на момент выхода MS-DOS 1.0 (август 1981)

Вот сводная таблица популярных ОС того времени и их поддержки оболочек (shcsh и др.):

Операционная системаПоддержка оболочек (shcsh, др.)Комментарий
UNIX Version 7 (V7)shПоследний классический UNIX Bell Labs, широко распространён
UNIX/32VshcshВерсия UNIX для архитектуры VAX
4BSD / 3BSDshcshУниверситетская ветка UNIX от Berkeley
UNIX System IIIshПервая коммерческая версия от AT&T, предшественник System V
Xenix (от Microsoft)shЛицензированная версия UNIX, продавалась Microsoft с 1980 г.
IDRISshUNIX-подобная ОС для PDP-11 и Intel
Coherent (Mark Williams)sh (похожая)Недорогая альтернатива UNIX для ПК
CP/M (Digital Research)❌ (Нет sh, только простейший CLI)Не UNIX, самая популярная ОС для 8-битных ПК
MS-DOS 1.0❌ (только COMMAND.COM)Минимальная командная оболочка, никаких скриптов или pipe

💡 Что такое shcsh

  • 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.){:target=»_blank»} без функций, циклов и модулей.

Были и внешние команды — отдельные исполняемые файлы (.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{:target=»_blank»} (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.
Совместимость с POSIXNT поставлялся с POSIX-сабсистемой, сертифицированной по POSIX.1.

📜 Линейка NT:

Версия NTГодКомментарий
NT 3.11993Первый релиз NT
NT 3.5 / 3.511994–1995Улучшения, оптимизация
NT 4.01996Интерфейс Windows 95, но ядро NT
Windows 20002000NT 5.0
Windows XP2001NT 5.1
Windows Vista2007NT 6.0
Windows 102015NT 10.0
Windows 112021Тоже 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Управление службами
tasklisttaskkillУправление процессами
gpedit.mscГрупповая политика (локально)
MMCКонсоль со снап-инами для управления
WMIДоступ к системной информации (через wmic, VBScript, или COM)
WbemTest.exeGUI для тестирования WMI-запросов
eventvwrПросмотр журналов событий
perfmonМониторинг ресурсов
🛠 Примеры автоматизации:

  • VBScript-файлы (*.vbs) для администрирования пользователей, сетей, принтеров и служб.
  • WMIC — командный интерфейс к WMI (например: wmic process list brief).
  • .cmd скрипты с вызовами netscregwmic, и т.д.

⚙️ Windows Scripting Host (WSH)

  • Впервые появился в Windows 98, активно использовался в Windows 2000 и XP.
  • Позволял выполнять VBScript и JScript-файлы из командной строки:Set objShell = WScript.CreateObject(«WScript.Shell») objShell.Run «notepad.exe»

Часть 1.

Только в 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, у которых есть:

  • 🧱 Свойства (NameLengthCreationTimeExtension, …)
  • 🛠 Методы (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 — ваш главный помощник.

  1. Получим справку о самой справке:Get-Help Get-Help
  2. Получим базовую справку о команде для работы с процессами:Get-Help Get-Process
  3. Посмотрим примеры использования этой команды:Get-Help Get-Process -ExamplesЭто невероятно полезный параметр, который часто дает готовые решения для ваших задач.
  4. Получим максимально подробную информацию о команде:Get-Help Get-Process -Full

В следующей части: конвеер или цепочка команд (PipeLines)

Метки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *