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

Философия PowerShell. Части 0,1.

  • hypo69 

Часть 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/32Vsh, cshВерсия UNIX для архитектуры VAX
4BSD / 3BSDsh, cshУниверситетская ветка 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

💡 Что такое 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.
Совместимость с 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
Переносимость ядра❌ Только x86x86, 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.exeGUI для тестирования 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 — ваш главный помощник.

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

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

Метки:

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

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