Серия «Философия PowerShell»

135

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

Часть 0.

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

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

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

Что такое 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

Философия PowerShell. Части 0,1 Вступление и первый командлет Powershell, Cmd, Администрирование, Windows, Shell, Длиннопост
  • CONFIG.SYS

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

В Майкрософт было понятно, что DOS тупиковая ветвь и они почти сразу начали разрабатывать принциально новое ядро.

Ядро Windows NT(New Technology) впервые появилось с релизом операционной системы:

Windows NT 3.1 — 27 июля 1993 года


  • Разработка началась: в 1988 году под руководством Дейва Катлера (бывшего инженера DEC, создателя VMS) с целью создать полностью новую, защищённую, переносимую и многозадачную ОС, не совместимую с MS-DOS на уровне ядра.

  • NT 3.1 — называлась так, чтобы подчеркнуть совместимость с Windows 3.1 на уровне интерфейса, но была совершенно новой архитектурой.


Что принесло ядро NT:

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

Линейка NT:

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

Ядро NT было хорошим, годным продуктом от Майкрософт, если бы не одно большое «НО!»


Но средствам автоматизации и администрирования не уделялось должного внимание вплоть до 2002 года.

Microsoft использовала совершенно разные подходы, стратегии и инструменты для администрирования. Всё это было разрозненным, часто GUI-ориентированным и не всегда автоматизируемым.


Список некоторых инструментов:

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

Инструменты автоматизации

  • 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)

Сегодня PowerShell Core работает на Windows macOS Linux

Параллельно шла разработка фреймворка .NET и powershell был в нее глубоко интегрирован, в следующих частях я покажу примеры

А теперь — самое главное!


Главное преимущество PowerShell по сравнению с классическими командными оболочками — это то, что он работает с объектами, а не с текстом. Когда вы выполняете команду, она возвращает вам не просто текст, а структурированный объект (или коллекцию объектов), у которого есть четко определенные свойства (Properties) и методы (Methods).

Смотрите, как PowerShell элегантно решает задачу благодаря работе с объектами

Как было: dir и ручной парсинг

В CMD (и в старом COMMAND.COM, и в cmd.exe) команда dir возвращает результат работы как обычный текст. Пример вывода:

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

Допустим, вы хотите извлечь имя файла и размер каждого файла. Вам придётся парсить строки вручную:

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

Результат:

Философия PowerShell. Части 0,1 Вступление и первый командлет Powershell, Cmd, Администрирование, Windows, Shell, Длиннопост
  • Get-ChildItem возвращает массив объектов файлов/папок

  • Select-Object позволяет легко получить нужные свойства


Что на самом деле возвращает Get-ChildItem?

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

> $item = Get-ChildItem -Path .\11.md
> $item | Get-Member

Результат:

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

PowerShell возвращает объекты типа System.IO.FileInfo, у которых есть:

  • Свойства (Name, Length, CreationTime, Extension, …)

  • Методы (Delete(), CopyTo(), MoveTo() и т.д.)

Вы работаете с полноценными объектами, а не со строками.


Синтаксис «Глагол-Существительное»:

PowerShell использует строгий и логичный синтаксис команд:
Глагол-Существительное (Verb-Noun)

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

Существительное

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

Даже если вы не знаете точной команды, вы можете предположить её по смыслу — и почти всегда угадаете.


Командлет Get-Help — ваш главный помощник.

Получим справку о самой справке:
> Get-Help Get-Help

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

Получим базовую справку о команде для работы с процессами:
> Get-Help Get-Process

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

Посмотрим примеры использования этой команды:
> Get-Help Get-Process -Examples

Если файл `help` не найден в системе — получим такое сообщение:

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

Решение:
> Update-Help

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

Для одного языка:
> Update-Help -UICulture en-US

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


`-Examples` это невероятно полезный параметр, который часто дает готовые решения для ваших задач.

  1. Получим максимально подробную информацию о команде:
    > Get-Help Get-Process -Full

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

    Полезно? Подпишись.
    Понравилось — ставь «+»
    Удачи! 🚀

UPD:

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView

А давайте встроим ии в powershell

Показать полностью 17
27

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов

Дисклеймер. в редакторе пикабу нет редактора кода. Поэтому картинки и вырвиглазное форматирование. В конце статьи я дам ссылки на гитхаб . Там полноценная статья. Вы можете почитать тут, а примеры копировать из гитхаб

❗ Важно: Я пишу про PS7 (PowerShell 7). Он отличается от PS5 (PowerShell 5). Начиная с седьмой версии ps стал кросплатформенным. Из-за этого изменилось поведение некоторых команд.

В первой части мы установили ключевой принцип: PowerShell работает с объектами, а не с текстом. Этот пост посвящен некоторым важным инструментам PowerShell: научимся передавать объекты по конвейеру, анализировать их с помощью Get-Member, сохранять результаты в переменные и автоматизировать все это в файлах скриптов (.ps1) с экспортом результатов в удобные форматы.


1. Что такое конвейер (|)?

Конвейер в PowerShell это механизм передачи полноценных .NET объектов (а не просто текста) от одной команды к другой, где каждый следующий командлет получает структурированные объекты со всеми их свойствами и методами.

Символ | (вертикальная черта) — это оператор конвейера. Его задача — взять результат (вывод) команды, стоящей слева от него, и передать его на вход команде, стоящей справа.

Команда 1 (создает объекты) → | → Команда 2 (получает и обрабатывает объекты) → | → Команда 3 (получает обработанные объекты) → | ...

Классический UNIX-конвейер: Поток текста

В bash по конвейеру передается поток байтов, который обычно интерпретируется как текст.

Найти все процессы 'nginx' и посчитать их количество
> ps -ef | grep 'nginx' | wc -l

Здесь `ps` выводит текст, `grep` фильтрует этот текст, а `wc` считает строки. Каждая утилита ничего не знает о "процессах", она работает только со строками.

PowerShell-конвейер: Поток объектов

Пример: Давайте получим все процессы, отсортируем их по использованию CPU и выберем 5 самых "прожорливых".

> Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Здесь Get-Process создает объекты процессов. Sort-Object получает эти объекты и сортирует их по свойству CPU. Select-Object получает отсортированные объекты и выбирает первые 5.

Вы наверняка заметили в команде слова, начинающиеся с дефиса (-): -Property, -Descending, -First. Это параметры. Параметры — это настройки, переключатели и инструкции для командлета. Они позволяют управлять тем, КАК команда будет выполнять свою работу. Без параметров команда работает в режиме по умолчанию, а с параметрами вы даете ей конкретные указания.

Основные типы параметров:

  • Параметр со значением: требует дополнительной информации.

    -Property CPU: Мы говорим Sort-Object, по какому свойству сортировать. CPU — это значение параметра.

    -First 5: Мы говорим Select-Object, сколько объектов выбрать. 5 — это значение параметра.

  • Параметр-переключатель (флаг): Не требует значения. Само его наличие в команде включает или выключает определенное поведение.

    -Descending: Этот флаг говорит Sort-Object изменить порядок сортировки на обратный (от большего к меньшему). Ему не нужно дополнительное значение — он сам по себе инструкция.

> Get-Process -Name 'svchost' | Measure-Object

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Эта команда отвечает на очень простой вопрос: "Сколько именно процессов с именем svchost.exe сейчас запущено в моей системе?"

Разбор по шагам

Шаг 1: Get-Process -Name 'svchost'

Эта часть команды обращается к операционной системе и просит найти все без исключения запущенные процессы, у которых имя исполняемого файла — svchost.exe. В отличие от процессов типа notepad (которых обычно один или два), процессов svchost в системе всегда много. Команда вернет массив (коллекцию) объектов, где каждый объект — это отдельный, полноценный процесс svchost со своим уникальным ID, использованием памяти и т.д. PowerShell нашел в системе, например, 90 процессов svchost и теперь держит в руках коллекцию из 90 объектов.

Шаг 2: | (Оператор конвейера)

Этот символ берет коллекцию из 90 объектов svchost, полученную на первом шаге, и начинает передавать их по одному на вход следующей команде.

Шаг 3: Measure-Object

Поскольку мы вызвали Measure-Object без параметров (таких как -Property, -Sum и т.д.), он выполняет свою операцию по умолчанию — просто считает количество "предметов", которые ему передали. Раз, два, три ... После того как все объекты посчитаны, Measure-Object создает свой собственный объект-результат, в котором есть свойство Count, равное итоговому числу.

Count: 90 — это и есть ответ на наш вопрос. Запущено 90 процессов svchost. Остальные поля пустые, потому что мы не просили Measure-Object выполнять более сложные вычисления.

Пример с svchost и параметрами

Давайте изменим нашу задачу. Теперь мы хотим не просто посчитать процессы svchost, а узнать, сколько всего оперативной памяти (в мегабайтах) они потребляют вместе.

Для этого нам понадобятся параметры:

  • -Property WorkingSet64: Эта инструкция говорит Measure-Object: "Из каждого объекта svchost, который к тебе придет, возьми числовое значение из свойства WorkingSet64 (это использование памяти в байтах)".

  • -Sum: Эта инструкция-флаг говорит: "Сложи все эти значения, которые ты взял из свойства WorkingSet64".

Наша новая команда будет выглядеть так:

> Get-Process -Name 'svchost' | Measure-Object -Property WorkingSet64 -Sum

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
  1. Get-Process найдет количество объектов svchost.

  2. Конвейер | передаст их в Measure-Object.

  3. Но теперь Measure-Object работает по-новому:

    • Он берет первый объект svchost, смотрит его свойство .WorkingSet64 (например, 25000000 байт) и запоминает это число.

    • Берет второй объект, смотрит его .WorkingSet64 (например, 15000000 байт) и прибавляет к предыдущему.

    • ...и так далее для всех объектов.

  4. В итоге Measure-Object создаст объект-результат, но теперь он будет другим.

  • Count: 92: Количество объектов.

  • Sum: 1661890560: Это общая сумма всех значений WorkingSet64 в байтах.

  • Property: WorkingSet64: Это поле теперь тоже заполнено, оно информирует нас, какое именно свойство было использовано для вычислений.

2. Переменные (Обычные и специальная $_)

Переменная — это именованное хранилище в памяти, которое содержит какое-либо значение.

Этим значением может быть что угодно: текст, число, дата или, что самое важное для PowerShell, целый объект или даже коллекция объектов. Имя переменной в PowerShell всегда начинается со знака доллара ($). Примеры: $name, $counter, $processList.

Специальная переменная $_?

$_ — это сокращение для "текущий объект" или "вот эта штука". Представьте себе конвейер на заводе. По нему едут разные детали (объекты).

$_ — это та самая деталь, которая находится прямо сейчас перед вами (или перед роботом-обработчиком).

Источник (Get-Process) — высыпает на конвейер целую коробку с деталями (всеми процессами).

Конвейер (|) — заставляет эти детали двигаться по ленте по одной.

Обработчик (Where-Object или ForEach-Object) — это робот, который смотрит на каждую деталь.

Переменная $_ — это та самая деталь, которая сейчас находится в "руках" у робота.

Когда робот закончит с одной деталью, конвейер подает ему следующую, и $_ теперь будет указывать уже на нее.

Давайте посчитаем, сколько всего памяти используют процессы svchost, и выведем результат на монитор.

1. Выполняем команду и сохраняем ее сложный объект-результат в переменную $svchostMemory

> $svchostMemory = Get-Process -Name svchost | Measure-Object -Property WorkingSet64 -Sum

2. Теперь мы можем работать с сохраненным объектом. Достаем из него свойство Sum

> $memoryInMB = $svchostMemory.Sum / 1MB

3. Выводим результат на экран, используя новую переменную

> Write-Host "Все процессы svchost используют $memoryInMB МБ памяти."

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
  • Write-Host — это специализированный командлет, чья единственная задача — показать текст непосредственно пользователю в консоли.

  • Строка в двойных кавычках: "..." - текстовая строка, которую мы передаем командлету Write-Host в качестве аргумента. Почему двойные, а не одинарные кавычки?

    В PowerShell есть два типа кавычек:

    • Одинарные ('...'): Создают буквальную строку. Все, что внутри них, воспринимается как обычный текст, без исключений.

    • Двойные ("..."): Создают расширяемую (или подстановочную) строку. PowerShell "сканирует" такую строку на предмет переменных (начинающихся с $) и подставляет на их место их значения.

  • $memoryInMB. Это переменная, в которую мы на предыдущем шаге нашего скрипта положили результат вычислений. Когда Write-Host получает строку в двойных кавычках, происходит процесс, называемый "подстановка переменных" (String Expansion):

    1. PowerShell видит текст "Все процессы svchost используют ".

    2. Затем он натыкается на конструкцию $memoryInMB. Он понимает, что это не просто текст, а переменная.

    3. Он заглядывает в память, находит значение, хранящееся в $memoryInMB (например, 1585.52).

    4. Он подставляет это значение прямо в строку.

    5. Затем он добавляет оставшуюся часть текста: " МБ памяти.".

    6. В итоге, в Write-Host передается уже готовая, собранная строка: "Все процессы svchost используют 1585.52 МБ памяти.".

Запустите блокнот!

  1. Находим процесс Блокнота и сохраняем его в переменную $notepadProcess

> $notepadProcess = Get-Process -Name notepad

  1. Обращаемся к свойству 'Id' этого объекта через точку и выводим его

> Write-Host "ID процесса 'Блокнот' равен: $($notepadProcess.Id)"

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

❗ Важно: Write-Host "ломает" конвейер. Текст, выведенный им, нельзя передать дальше по конвейеру для обработки. Он предназначен только для отображения.


3. Get-Member (Инспектор объектов)

Мы знаем, что по конвейеру "текут" объекты. Но как узнать, из чего они состоят? Какие у них есть свойства и какие действия (методы) с ними можно совершать?

командлет Get-Member (псевдоним: gm) главный инструмент для исследования. Прежде чем работать с объектом, пропустите его через Get-Member, чтобы увидеть все его возможности.

Давайте проанализируем объекты, которые создает Get-Process:

> Get-Process | Get-Member

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Разберем каждую часть вывода Get-Member.

TypeName: System.Diagnostics.Process - Это полное, официальное "имя типа" объекта из библиотеки .NET. Это его "паспорт". Эта строка говорит вам, что все объекты, которые возвращает Get-Process, являются объектами типа System.Diagnostics.Process. Это гарантирует, что у них у всех будет одинаковый набор свойств и методов. Вы можете загуглить "System.Diagnostics.Process", чтобы найти официальную документацию Microsoft с еще более подробной информацией.

  • Колонка 1: Name

Это простое, человекочитаемое имя свойства, метода или другого "члена" объекта. Именно это имя вы будете использовать в своем коде для доступа к данным или выполнения действий.

  • Колонка 2: MemberType (Тип объекта)

Это самая важная для понимания колонка. Она классифицирует, чем является каждый объект. Это его "должность", которая говорит вам, КАК его использовать.

  • Property (Свойство): характеристика или порция данных, хранящаяся внутри объекта. Вы можете "прочитать" ее значение.

    • Примеры на скриншоте: BasePriority, HandleCount, ExitCode. Это просто данные, которые можно посмотреть.

  • Method (Метод): ДЕЙСТВИЕ, которое можно совершить с объектом. Методы всегда вызываются с круглыми скобками ().

    • Примеры на скриншоте: Kill, Refresh, WaitForExit. Вы бы написали $process.Kill() или $process.Refresh().

  • AliasProperty (Псевдоним свойства): дружелюбный псевдоним для другого, более длинного свойства. PowerShell добавляет их для удобства и краткости.

    • Примеры на скриншоте: WS — это короткий псевдоним для WorkingSet64. Name — для ProcessName. VM — для VirtualMemorySize64.

  • Event (Событие): УВЕДОМЛЕНИЕ о том, что что-то произошло, на которое можно "подписаться".

    • Пример на скриншоте: Exited. Ваш скрипт может "слушать" это событие, чтобы выполнить какое-то действие сразу после того, как процесс завершится.

  • CodeProperty и NoteProperty: специальные типы свойств, часто добавляемые самим PowerShell для удобства. CodeProperty вычисляет свое значение "на лету", а NoteProperty — это простое свойство-заметка, добавленное к объекту.

  • Колонка 3: Definition (Определение)

Это техническое определение или "подпись" члена. Она дает вам точные детали для его использования. Ее содержимое зависит от MemberType:

  • Для AliasProperty: Показывает, чему равен псевдоним. Это невероятно полезно!

    • Пример на скриншоте: WS = WorkingSet64. Вы сразу видите, что WS — это просто короткая запись для WorkingSet64.

  • Для Property: Показывает тип данных, который хранится в свойстве (например, int для целого числа, string для текста, datetime для даты и времени), и что можно с ним делать ({get;} — только читать, {get;set;} — читать и изменять).

    • Пример на скриншоте: int BasePriority {get;}. Это целочисленное свойство, которое можно только прочитать.

  • Для Method: Показывает, что метод возвращает (например, void — ничего, bool — true/false) и какие параметры (входные данные) он принимает в скобках.

    • Пример на скриншоте: void Kill(). Это значит, что метод Kill ничего не возвращает и может быть вызван без параметров. Также есть вторая версия void Kill(bool entireProcessTree), которая принимает логическое значение (true/false).

В виде таблицы

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Пример: Работа с окнами процессов

1. Проблема:

"Я открыл много окон Блокнота. Как мне программно свернуть все, кроме главного, а затем закрыть только то, у которого в заголовке есть слово 'Untitled'?"

Откройте несколько экземпляров блокнота (Windows Notepad) на компьютере

2. Исследование с Get-Member:

Нам нужно найти свойства, связанные с окном и его заголовком.

> Get-Process -Name notepad | Get-Member

Анализ результата Get-Member:

  • Листая свойства, мы находим MainWindowTitle. Тип string. Отлично, это заголовок главного окна!

  • В методах мы видим CloseMainWindow(). Это более "мягкий" способ закрыть окно, чем Kill().

  • Также в методах есть WaitForInputIdle(). Звучит интересно, возможно, это поможет дождаться, пока процесс будет готов к взаимодействию.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Get-Member показал нам свойство MainWindowTitle, которое является ключом к решению задачи и позволяет взаимодействовать с процессами на основе состояния их окон, а не просто по имени.

3. Решение:

Теперь мы можем построить логику, основанную на заголовке окна.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Пример: Найти родительский процесс

1. Проблема:

"Иногда я вижу в системе много дочерних процессов chrome.exe. Как мне узнать, какой из них является главным, "родительским" процессом, который их всех запустил?"

2. Исследование с Get-Member:

Нам нужно найти что-то, что связывает один процесс с другим.

> Get-Process -Name chrome | Select-Object -First 1 | Get-Member

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Анализ результата Get-Member:

  • Внимательно просматривая список, мы находим свойство типа CodeProperty с именем Parent.

  • Его определение (Definition) — System.Diagnostics.Process Parent{get=GetParentProcess;}. Это вычисляемое свойство, которое при обращении к нему возвращает объект родительского процесса.

3. Решение:

Теперь мы можем написать скрипт, который для каждого процесса chrome будет выводить информацию о его родителе.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Мы сразу видим, что процессы с ID 4756, 7936, 8268 и 9752 были запущены процессом с ID 14908. Также можно заметить интересный случай с процессом ID: 7252, у которого родительский процесс не определился (возможно, родитель уже успел завершиться к моменту проверки). Модификация скрипта с проверкой if ($parent) аккуратно обрабатывает этот случай, не вызывая ошибки. Get-Member помог нам обнаружить "скрытое" свойство Parent, которое предоставляет мощные возможности для анализа иерархии процессов.

4. Файл .ps1 (Создание скриптов)

Когда ваша цепочка команд становится полезной, вы захотите сохранить ее для многократного использования. Для этого и нужны скрипты — текстовые файлы с расширением .ps1.

Разрешение на запуск скриптов

По умолчанию в Windows запрещен запуск локальных скриптов. Чтобы это исправить для текущего пользователя, выполните один раз в PowerShell от имени администратора:

> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Это безопасная настройка, которая разрешает запускать ваши собственные скрипты и скрипты, подписанные доверенным издателем.

Пример скрипта system_monitor.ps1

Создайте файл с таким именем и вставьте в него код ниже. Этот скрипт собирает информацию о системе и генерирует отчеты.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост
Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Примечание: функция Export-Results будет определена в следующем разделе как пример хорошей практики.

5. Экспорт результатов

Чистые данные — это хорошо, но часто их нужно представить в удобном для человека или другой программы виде. PowerShell предлагает множество командлетов для экспорта.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

Дополнение к скрипту: функция экспорта

Давайте добавим в наш скрипт system_monitor.ps1 функцию, которая будет заниматься экспортом. Поместите этот код перед вызовом Export-Results.

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов Powershell, Автоматизация, Windows, IT, Администрирование, Гайд, Длиннопост

код на github

Теперь наш скрипт не просто собирает данные, но и аккуратно сохраняет их в двух форматах: CSV для анализа и HTML для быстрого просмотра.

Заключение

  1. Конвейер (|) — главный инструмент для объединения команд и обработки объектов.

  2. Get-Member — анализ объектов, который показывает, из чего они состоят.

  3. Переменные ($var, $_) позволяют сохранять данные и обращаться к текущему объекту в конвейере.

  4. Файлы .ps1 превращают команды в переиспользуемые инструменты автоматизации.

  5. Командлеты экспорта (Export-Csv, ConvertTo-Html) Экспортируют данные в соответствующем формате.

В следующей части мы применим эти знания для навигации и управления файловой системой, исследуя объекты System.IO.DirectoryInfo и System.IO.FileInfo.

К первой части

Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀

UPD:

Статья на github:
https://github.com/hypo69/1001-python-ru/blob/master/articles/Философия PowerShell/02.md

Исходники:
system-monitor.ps1:
https://github.com/hypo69/1001-python-ru/blob/master/articles/Философия PowerShell/code/02/system_monitor.ps1


Третья часть:
Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView

А давайте встроим ии в powershell

Показать полностью 19
67

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями

Дисклеймер. в редакторе пикабу нет редактора кода поэтому картинки и вырвиглазное форматирование. Но на гитхабе лежит полноценная статья. Вы можете почитать тут, а примеры копировать из гитхаб

В предыдущей части мы исследовали конвейеры и абстрактные объекты процессов. Теперь давайте применим наши знания о конвейере и объектах к одной из частых задач пользователя или администратора — работе с файловой системой. В PowerShell эта работа построена на тех же принципах: команды возвращают объекты, которые можно передавать по конвейеру для дальнейшей обработки.


1. Концепция PowerShell Drives (PSDrives)

Прежде чем начать работать с файлами, важно понять концепцию PowerShell-дисков (PSDrives). В отличие от cmd.exe, где диски — это только буквы C:, D: и так далее, в PowerShell "диск" — это абстракция для доступа к любому иерархическому хранилищу данных.

> Get-PSDrive

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Результат покажет не только физические диски, но и псевдо-диски:

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Эта унификация означает, что вы можете "зайти" в реестр (Set-Location HKLM:) и получить список его ключей той же командой Get-ChildItem, которой получаете список файлов на диске C:. Это невероятно мощная концепция.

Примеры работы с различными провайдерами

  • Хранилище сертификатов (Cert:) Позволяет работать с цифровыми сертификатами так, будто это файлы в папках.

    Задача: Найти все SSL-сертификаты на локальной машине, срок действия которых истекает в ближайшие 30 дней.
    > Set-Location Cert:\LocalMachine\My
    > Get-ChildItem | Where-Object { $_.NotAfter -lt (Get-Date).AddDays(30) } | Select-Object Subject, NotAfter, Thumbprint

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Переменные окружения (Env:) Предоставляет доступ к переменным окружения Windows (%PATH%, %windir% и т.д.) как к файлам.

Задача: Получить путь к системной папке Windows и добавить к нему путь к System32.

Получаем значение переменной windir:
> $windowsPath = (Get-Item Env:windir).Value
Собираем полный путь
> $system32Path = Join-Path -Path $windowsPath -ChildPath "System32"
> Write-Host $system32Path

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Реестр Windows (HKCU: и HKLM:) Представьте, что реестр — это просто еще одна файловая система. Ветки — это папки, а параметры — свойства этих папок.

Задача: Узнать полное название установленной версии Windows из реестра.
Переходим в нужную ветку реестра:
> Set-Location "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
Получаем свойство (параметр реестра) с именем "ProductName"
> Get-ItemProperty -Path . -Name "ProductName"

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Переменные сессии (Variable:) Позволяет управлять всеми переменными ($myVar, $PROFILE, $Error и т.д.), определенными в текущей сессии.

Задача: Найти все переменные, связанные с версией PowerShell ($PSVersionTable, $PSHOME и др.).
Находим все переменные, начинающиеся с "PS":
> Get-ChildItem Variable:PS*

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Получаем значение конкретной переменной:
> Get-Variable -Name "PSVersionTable"

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

2. Навигация и анализ

Основы навигации
- Узнать, где мы находимся (возвращает объект PathInfo):
> Get-Location # Псевдонимы: gl, pwd

- Переход в корень диска C:
> Set-Location C:\ # Псевдонимы: sl, cd

- Переход в домашнюю папку текущего пользователя:
> Set-Location ~

Показать содержимое текущей папки (возвращает коллекцию объектов):
> Get-ChildItem # Псевдонимы: gci, ls, dir

- Рекурсивный поиск. Найти файл hosts в системе, игнорируя ошибки "Доступ запрещен":
> Get-ChildItem C:\ -Filter "hosts" -Recurse -ErrorAction SilentlyContinue

Ключ -Recurse (Рекурсивно): Заставляет командлет работать не только с указанным элементом, но и со всем его содержимым.

Ключ -ErrorAction SilentlyContinue: Инструкция игнорировать ошибки и продолжать работу молча.

Анализ дискового пространства

Классический пример мощи конвейера: найти, отсортировать, отформатировать и выбрать.

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост


Подсказка как вводить длинные команды.

PowerShell позволяет разбивать их на несколько строк для удобства чтения.

  • После оператора конвейера (|): Это самый частый и удобный способ. Просто нажмите Enter после символа |. PowerShell увидит, что команда не завершена, и будет ждать продолжения на следующей строке.

  • В любом другом месте: Используйте символ обратной кавычки (backtick) ` в конце строки, а затем нажмите Enter. Этот символ говорит PowerShell: "Команда продолжится на следующей строке".

  • В редакторах (ISE, VS Code): Сочетание клавиш Shift+Enter обычно автоматически вставляет перенос строки, не запуская команду.

Фильтрация содержимого и операторы логики

- Найти все .exe файлы. Параметр -Filter работает очень быстро:
> Get-ChildItem C:\Windows -Filter "*.exe"

Get-ChildItem возвращает коллекцию объектов. Мы можем передать ее по конвейеру в Where-Object для дальнейшей фильтрации.

> Get-ChildItem C:\Windows | Where-Object { $_.PSIsContainer -eq $false }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Эта команда знакомит нас с одним из фундаментальных понятий в скриптах PowerShell: операторами сравнения.

Операторы сравнения и логики

Это специальные ключи для сравнения значений. Они всегда начинаются с дефиса (-) и являются основой для фильтрации данных в Where-Object и построения логики в if.

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Тема операторов логики - очень обширная и я ей посвящу отдельную часть (или даже две). А пока вооружившись этими операторами, мы можем фильтровать, сортировать и выбирать нужные нам файлы и папки, используя всю мощь объектного конвейера.

Примеры использования в файловой системе

  • Найти файл по точному имени (с учетом регистра):

    > Get-ChildItem C:\Windows\System32 -Recurse | Where-Object { $_.Name -eq "kernel32.dll" }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все файлы, начинающиеся с "host", но не являющиеся папками:

    > Get-ChildItem C:\Windows\System32\drivers\etc | Where-Object { ($_.Name -like "host*") -and (-not $_.PSIsContainer) }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все файлы журналов (.log), размер которых превышает 50 мегабайт:

    > Get-ChildItem C:\Windows\Logs -Filter "*.log" -Recurse | Where-Object { $_.Length -gt 50MB }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все временные файлы (.tmp) и файлы бэкапов (.bak) для очистки: Оператор -in здесь гораздо элегантнее, чем несколько условий с -or.

    > $extensionsToDelete = ".tmp", ".bak", ".old" Get-ChildItem C:\Temp -Recurse | Where-Object { > $_.Extension -in $extensionsToDelete }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти все файлы Word (.docx), созданные за последнюю неделю:

    > $oneWeekAgo = (Get-Date).AddDays(-7) Get-ChildItem C:\Users\MyUser\Documents -Filter "*.docx" -Recurse | Where-Object { $_.CreationTime -ge $oneWeekAgo }

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост
  • Найти пустые файлы (размером 0 байт), которые не являются папками:

    > Get-ChildItem C:\Downloads -Recurse | Where-Object { ($_.Length -eq 0) -and (-not $_.PSIsContainer) }

  • Найти все исполняемые файлы (.exe), которые были изменены в этом году, но НЕ в этом месяце. Этот сложный пример демонстрирует мощь комбинирования операторов.

    > Get-ChildItem C:\Program Files -Filter "*.exe" -Recurse |
    Where-Object {
    ($_.LastWriteTime.Year -eq (Get-Date).Year) -and ($_.LastWriteTime.Month -ne (Get-Date).Month)
    }

Примечание: скобки () вокруг каждого условия используются для группировки и улучшения читаемости, особенно в сложных случаях.

Будьте внимательны с рекурсией:

  • Если очень много файлов/папок — -Recurse может рекурсивно заходить в десятки тысяч элементов.

  • Символические ссылки / циклические ссылки — могут вызывать бесконечную рекурсию.

  • Файлы без прав доступа — могут блокировать выполнение.

4. Создание, управление и безопасное удаление

Создание, копирование и перемещение:


> New-Item -Path "C:\Temp\MyFolder" -ItemType Directory
> Add-Content -Path "C:\Temp\MyFolder\MyFile.txt" -Value "Первая строка"
> Copy-Item -Path "C:\Temp\MyFolder" -Destination "C:\Temp\MyFolder_Copy" -Recurse

Безопасное удаление

Remove-Item — потенциально опасный командлет, поэтому в PowerShell есть встроенные механизмы защиты. Ключ -WhatIf (Что если?): Ваш лучший друг. Он не выполняет команду, а лишь выводит в консоль сообщение о том, что бы произошло.

> Remove-Item C:\Temp\MyFolder -Recurse -Force -WhatIf

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Только убедившись, что все верно, убираем -WhatIf и ВЫПОЛНЯЕМ команду
> Remove-Item C:\Temp\MyFolder -Recurse -Force


Введение в функции

Когда одна строка кода превращается в сложный набор команд, который вы хотите использовать снова и снова, наступает время для создания функций.

Как использовать и сохранять функции

Существует три основных способа сделать ваши функции доступными:

Способ 1: Временный (для тестов) Вы можете набрать в консопли или просто скопировать и вставить весь код функции в консоль PowerShell. Функция будет доступна до закрытия этого окна.

Способ 2: Постоянный, но ручной (через .ps1 файл) Это самый распространенный способ для организации и обмена инструментами. Вы сохраняете функцию в файл .ps1 и загружаете ее в сессию, когда она вам нужна.

Способ 3: Автоматический (через профиль PowerShell) Это самый мощный способ для ваших личных, часто используемых инструментов.

Что такое профиль PowerShell? Это специальный скрипт .ps1, который PowerShell автоматически запускает каждый раз при старте. Все, что вы поместите в этот файл — псевдонимы, переменные и, конечно, функции — будет доступно в каждой вашей сессии по умолчанию.

Пример 1: Поиск дубликатов файлов

Давайте пройдем все шаги на примере функции Find-DuplicateFiles.

Шаг 1: Определяем код функции

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Шаг 2 (Вариант А): Сохраняем в отдельный файл для ручной загрузки

Сохраняем
> Set-Content -Path ".\Find-DuplicateFiles.ps1" -Value $functionCode
Загружаем
> . .\Find-DuplicateFiles.ps1

Dot Sourcing (. .\Find-DuplicateFiles.ps1): Эта специальная команда выполняет скрипт в текущем контексте, делая все его функции и переменные доступными в вашей консоли.

Вызываем:
> Find-DuplicateFiles -Path "C:\Users\$env:USERNAME\Downloads"

  1. Шаг 2 (Вариант Б): Добавляем в профиль для автоматической загрузки Сделаем эту функцию доступной всегда.

    Что такое профиль PowerShell? Это специальный скрипт .ps1, который PowerShell автоматически запускает каждый раз при старте. Все, что вы поместите в этот файл — псевдонимы, переменные и функции — будет доступно в каждой вашей сессии по умолчанию.

  2. Находим путь к файлу профиля. PowerShell хранит его в переменной $PROFILE.

    1. > $PROFILE

    Создаем файл профиля, если он не существует:

    > if (-not (Test-Path $PROFILE)) { New-Item -Path $PROFILE -Type File -Force }

  3. Добавляем код нашей функции в конец файла профиля.

    Add-Content -Path $PROFILE -Value $functionCode

  4. Перезапустите PowerShell (или выполните . $PROFILE), и теперь ваша команда Find-DuplicateFiles будет доступна всегда, как и Get-ChildItem.

Пример 2: Создание ZIP-архива с резервной копией

Код для файла Backup-FolderToZip.ps1:

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Детальный разбор функций я сделаю следующих частях.


Справочник командлетов для работы с файловой системой

1. Основные командлеты

Философия PowerShell. Часть 3: Навигация и управление файловой системой. Знакомство с операторами логики и функциями Powershell, Системное администрирование, Файловая система, Windows, Microsoft, IT, Гайд, Длиннопост

Нужно прочитать содержимое текстового файла? Используйте Get-Content. Нужно полностью перезаписать файл новым содержимым? Используйте Set-Content. Нужно добавить строчку в лог-файл, не стирая старые данные? Используйте Add-Content. Нужно проверить, существует ли файл перед записью? Используйте Test-Path.

2. Специализированные командлеты для продвинутых задач

Когда базовых командлетов недостаточно, PowerShell предлагает более специализированные инструменты. Они не дублируют базовые, а расширяют ваши возможности.

  • Работа с путями (Path)

    • Join-Path: Безопасно объединяет части пути, автоматически вставляя \.

    • Split-Path: Разбивает путь на части (папка, имя файла, расширение).

    • Resolve-Path: Преобразует относительный путь (например, . или ..\files) в полный, абсолютный.

  • Работа со свойствами и содержимым (Item Properties and Content)

    • Get-ItemProperty: Получает свойства конкретного файла (например, IsReadOnly, CreationTime).

    • Set-ItemProperty: Изменяет свойства файла или папки.

    • Clear-Content: Удаляет всё содержимое из файла, но оставляет сам файл пустым.

  • Продвинутая навигация (Location Stack)

    • Push-Location: "Запоминает" текущую директорию и переходит в новую.

    • Pop-Location: Возвращается в директорию, которую "запомнил" Push-Location.

  • Управление правами доступа (ACL)

    • Get-Acl: Получает список прав доступа (ACL) для файла или папки.

    • Set-Acl: Устанавливает права доступа для файла или папки (сложная операция).

Нужно изменить атрибут файла, например, сделать его «только для чтения»? Используйте Set-ItemProperty. Нужно полностью очистить лог-файл, не удаляя его? Используйте Clear-Content. Нужно временно перейти в другую папку в скрипте, а потом гарантированно вернуться назад? Используйте Push-Location и Pop-Location. Нужно узнать, кто имеет права на доступ к папке? Используйте Get-Acl.

В следующей части мы узнаем, как работать с другими хранилищами данных, такими как реестр Windows, используя те же самые подходы, углубимся в понятие функций, рассмотрим операторы логики и научимся интерактивно взаимодействовать с оболочкой

Философия PowerShell на github:

История и первый командлет

Часть 2: Конвейер (Pipeline), переменные, Get-Member, файл .ps1 и экспорт результатов. Исходники ко второй части:
system_monitor.ps1

Часть 3: Навигация и управление файловой системой.
Исходники к третьей части:
Find-DuplicateFiles.ps1
Backup-FolderToZip.ps1

Полезно? Подпишись.
Понравилось — ставь «+»
Удачи! 🚀

UPD:

Вышла четвертая часть Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView

Показать полностью 19
17

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView

  • В первой части мы определили два ключевых понятия powershell: конвейер и объект.

  • Во второй части я рассказал как объекты взаимодействуют через переменные и конвейер.

  • В третьей части познакомились с файловой системой и провайдерами.

  • Сегодня рассмотрим интерактивную работу с данными в консоли.

Дисклеймер. На пикабу нет редактора кода, поэтому картинки и кривое форматирование. В конце поста я размещу ссылки на статью и исходники в github. Приятного чтения.

Out-ConsoleGridView. GUI в консоли PowerShell.

❗ Важно: Все описываемые ниже инструменты требуют PowerShell 7.2 или новее.

Out-ConsoleGridView — это интерактивная таблица, прямо в консоли PowerShell, позволяющая:

  • просматривать данные в виде таблицы;

  • фильтровать и сортировать колонки;

  • выбирать строки курсором — для передачи их дальше по конвейеру.

  • и многое другое.

Out-ConsoleGridView является частью модуля Microsoft.PowerShell.ConsoleGuiTools. Для его использования сначала нужно установить этот модуль.

Для установки модуля выполните следующую команду в PowerShell:

Install-Module Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser

Install-Module загружает и устанавливает указанный модуль из репозитория в систему. Аналоги: pip install в Python и npm install в Node.js.

📎 Ключевые параметры Install-Module


Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView Powershell, Системное администрирование, Автоматизация, Инструкция, IT, Windows, Админ, Гайд, Консоли, Видео, Без звука, Короткие видео, Длиннопост

Ключевые параметры Install-Module

После установки вы можете передавать любой вывод в Out-ConsoleGridView для интерактивной работы.

# Классческий пример: вывод списка процессов в интерактивную таблицу:
> Get-Process | Out-ConsoleGridView

Интерфейс:

  • Фильтрация: Просто начните вводить текст, и список будет отфильтрован на лету.

  • Навигация: Используйте клавиши-стрелки для перемещения по списку.

  • Выбор: Нажмите Space для выбора/снятия выделения с одного элемента.

  • Множественный выбор: Ctrl+A для выбора всех элементов, Ctrl+D для снятия всего выделения.

  • Подтверждение: Нажмите Enter, чтобы вернуть выбранные объекты.

  • Отмена: Нажмите ESC, чтобы закрыть окно без возврата данных.

Что умеет Out-ConsoleGridView:

  • Отображать табличные данные прямо в консоли в виде интерактивной таблицы с навигацией по строкам и столбцам.

  • Сортировать столбцы по нажатию клавиш.

  • Фильтровать данные с помощью поиска.

  • Выбирать одну или несколько строк с возвратом результата.

  • Работать в чистой консоли без GUI-окон.

  • Поддерживать большое количество строк с прокруткой.

  • Поддерживать различные типы данных (строки, числа, даты и пр.).


Примеры использования Out-ConsoleGridView

Базовое использование — показать таблицу с возможностью интерактивного выбора. (checkbox)

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView Powershell, Системное администрирование, Автоматизация, Инструкция, IT, Windows, Админ, Гайд, Консоли, Видео, Без звука, Короткие видео, Длиннопост

Select process(es)

Выводится список процессов в интерактивной консольной таблице. Можно фильтровать по имени, сортировать столбцы и выбирать процессы. Выбранные процессы возвращаются в переменную $selected.


Выбор одной строки с обязательным возвратом результата. (radio)

$choice = Get-Service | Select-Object -First 20 | Out-ConsoleGridView -Title "Select a service" -OutputMode Single Write-Host "You selected service: $($choice.Name)"

Пользователь выбирает одну строку. -OutputMode Single запрещает выбирать несколько.


Интерактивное управление процессами:

Вы можете выбрать несколько процессов для остановки. Параметр -OutputMode Multiple указывает, что мы хотим вернуть все выбранные элементы.

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView Powershell, Системное администрирование, Автоматизация, Инструкция, IT, Windows, Админ, Гайд, Консоли, Видео, Без звука, Короткие видео, Длиннопост

Интерактивное управление процессами

Выбор файлов для архивации:

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView Powershell, Системное администрирование, Автоматизация, Инструкция, IT, Windows, Админ, Гайд, Консоли, Видео, Без звука, Короткие видео, Длиннопост

Выбор файлов для архивации

Выбор одного элемента для детального анализа:

Паттерн "Drill-Down" — от общего списка к деталям с Out-ConsoleGridView

Часто при работе с системными объектами мы сталкиваемся с дилеммой:

  1. Если запросить все свойства для всех объектов (Get-NetAdapter | Format-List *), вывод будет огромным и нечитаемым.

  2. Если показать краткую таблицу, мы потеряем важные детали.

  3. Иногда попытка получить все данные сразу может привести к ошибке, если один из объектов содержит некорректные значения.

Решение этой проблемы — паттерн "Drill-Down" (детализация). Его суть проста:

  • Шаг 1 (Обзор): Показать чистый, краткий и безопасный список элементов для выбора.

  • Шаг 2 (Детализация): После того как пользователь выбрал один конкретный элемент, показать ему всю доступную информацию именно по этому элементу.

Практический пример: Создание обозревателя сетевых адаптеров

Задача: Сначала показать краткий список сетевых адаптеров. После выбора одного из них, открыть второе окно со всеми его свойствами.

Готовый код:

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView Powershell, Системное администрирование, Автоматизация, Инструкция, IT, Windows, Админ, Гайд, Консоли, Видео, Без звука, Короткие видео, Длиннопост

Создание обозревателя сетевых адаптеров


Информация о системе.

код скрипта для получения информации о системе: Get-SystemMonitor.ps1

Создание командлета 'Get-SystemMonitor'

Шаг 1: Настройка переменной PATH

  1. Создайте постоянную папку для ваших инструментов, если еще не сделали этого. Например: C:\PowerShell\Scripts

  2. Поместите ваш файл Get-SystemMonitor.ps1 в эту папку.

  3. Добавьте эту папку в системную переменную PATH,

Шаг 2: Настройка псевдонима (alias) в профиле PowerShell

  1. Откройте ваш файл профиля PowerShell:

    notepad $PROFILE

  2. Добавьте в него следующую строку:

    Set-Alias -Name sysmon -Value "Get-SystemMonitor.ps1"
    где sysmon - псевдоним командлета Get-SystemMonitor

    Если вы когда-нибудь переместите папку C:\PowerShell\Scripts, вам нужно будет обновить только переменную PATH, а ваш файл профиля останется без изменений.

Перезапустите PowerShell

Закройте все открытые окна PowerShell и откройте новое. Это необходимо, чтобы система применила изменения как в переменной PATH, так и в вашем профиле.

Код скрипта для установки C:\PowerShell\Scripts в PATH: Add-Path.ps1

Запуск:
Get-SystemMonitor
или конкретный ресурс:
Get-SystemMonitor -Resource users
Реализованы cpu, memory, system, network, users, peripherals

🤝 Поздравляю. Вы создали первый командлет.

Пост на github

Полезно? Подпишись.
Понравилось — ставь «+»
Задавайте вопросы в комментариях 👇👇👇
Удачи! 🚀

Серия постов о PowerShell

UPD:

Практические примеры использования:
Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView)

А давайте встроим ии в powershell

Показать полностью 5 7
23

Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView

В предыдущей части мы познакомились с Out-ConsoleGridView — мощным инструментом для интерактивной работы с данными прямо в терминале. Если вы не знаете, что такое Out-ConsoleGridView, рекомендую начать отсюда 👉 Интерактивная работа: Out-ConsoleGridView

Я не буду повторять теорию, а сразу перейду к практике и покажу 10 сценариев, в которых этот командлет может сэкономить системному администратору или продвинутому пользователю массу времени.

Дисклеймер. В пикабу нет редактора кода - поэтому такое форматирование и картинки. В конце поста я дам ссылку на github. Почитайте, и если вам интересно смотрите код на гитхабе

Out-ConsoleGridView — это не просто "просмотрщик". Это интерактивный фильтр объектов в середине вашего конвейера.

Предварительные требования:

  • PowerShell 7.2 или новее.

  • Установленный модуль Microsoft.PowerShell.ConsoleGuiTools. Если вы его еще не установили:

    > Install-Module Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser


Пример 1: Интерактивная остановка процессов


> # Выбираем процессы в интерактивном режиме
> $procsToStop = Get-Process | Sort-Object -Property CPU -Descending | Out-ConsoleGridView -OutputMode Multiple

> # Если что-то было выбрано, передаем объекты на остановку
> if ($procsToStop) {
$procsToStop | Stop-Process -WhatIf
}

  • Get-Process получает все запущенные процессы.

  • Sort-Object упорядочивает их по загрузке CPU, чтобы самые "прожорливые" были наверху.

  • Out-ConsoleGridView отображает таблицу. Вы можете ввести chrome или notepad, чтобы мгновенно отфильтровать список, и выбрать нужные процессы клавишей Space.

  • После нажатия Enter выбранные объекты процессов попадают в переменную $procsToStop и передаются в Stop-Process.


Пример 2: Управление службами Windows

Нужно быстро перезапустить несколько служб, связанных с одним приложением (например, SQL Server).

> $services = Get-Service | Out-ConsoleGridView -OutputMode Multiple -Title "Выберите службы для перезапуска" if ($services) { $services | Restart-Service -WhatIf }

  1. Вы получаете список всех служб.

  2. Внутри Out-ConsoleGridView вы вводите в фильтр sql и сразу видите все службы, относящиеся к SQL Server.

  3. Выбираете нужные и нажимаете Enter. Объекты выбранных служб передаются на перезапуск.

Пример 3: Очистка папки "Загрузки" от больших файлов

Со временем папка "Загрузки" забивается ненужными файлами. Найдем и удалим самые большие из них.

Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView Powershell, Microsoft, Автоматизация, Системное администрирование, IT, Windows, Гайд, Видео, Без звука, Короткие видео, Длиннопост
  1. Мы получаем все файлы, сортируем их по размеру и с помощью Select-Object создаем удобную колонку SizeMB.

  2. В Out-ConsoleGridView вы видите отсортированный список, где легко выбрать старые и большие .iso или .zip файлы.

  3. После выбора их полные пути передаются в Remove-Item.


Пример 4: Добавление пользователей в группу Active Directory

Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView Powershell, Microsoft, Автоматизация, Системное администрирование, IT, Windows, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Вместо того чтобы вручную вводить имена пользователей, вы получаете удобный список, где можете быстро найти и выбрать нужных сотрудников по фамилии или логину.


Пример 5: Узнать, какие программы используют интернет прямо сейчас

Одна из частых задач: "Какая программа тормозит интернет?" или "Кто и куда отправляет данные?". С помощью Out-ConsoleGridView можно получить наглядный ответ.

> # Получаем все активные TCP-подключения
> $connections = Get-NetTCPConnection -State Established | Select-Object RemoteAddress, RemotePort, OwningProcess, @{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName}}

> # Выводим в интерактивную таблицу для анализа
> $connections | Out-ConsoleGridView -Title "Активные интернет-подключения"

  1. Get-NetTCPConnection -State Established собирает все установленные сетевые подключения.

  2. С помощью Select-Object мы формируем удобный отчет: добавляем имя процесса (ProcessName) к его ID (OwningProcess), чтобы было понятно, какая программа установила соединение.

  3. Out-ConsoleGridView показывает вам живую картину сетевой активности.



Пример 6: Анализ установки ПО и обновлений

Мы будем искать события от источника "MsiInstaller". Он отвечает за установку, обновление и удаление большинства программ (в формате .msi), а также за многие компоненты обновлений Windows.

Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView Powershell, Microsoft, Автоматизация, Системное администрирование, IT, Windows, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Внутри таблицы: Вы можете отфильтровать список по названию программы (например, Edge или Office), чтобы увидеть всю историю ее обновлений. Вы можете отсортировать по Id, чтобы найти неудачные установки (11708).

Внутри таблицы:

  • Вы можете отфильтровать список по названию программы (например, Edge или Office), чтобы увидеть всю историю ее обновлений.

  • Вы можете отсортировать по Id, чтобы найти неудачные установки (11708).


Пример 7: Интерактивное удаление программ

Вы получаете список всего установленного ПО. В интерфейсе вы можете легко найти и выбрать несколько программ для удаления.


Пример 8: Связывание (Chaining) Out-ConsoleGridView

Это самый мощный прием. Выход одной интерактивной сессии становится входом для другой. Задача: Выбрать одну из ваших папок с проектами, а затем выбрать из нее определенные файлы для создания ZIP-архива.

Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView Powershell, Microsoft, Автоматизация, Системное администрирование, IT, Windows, Гайд, Видео, Без звука, Короткие видео, Длиннопост
  1. Первый Out-ConsoleGridView показывает вам список папок внутри ваших "Документов". Вы можете быстро найти нужную, введя часть ее имени, и выбрать одну папку.

  2. Если папка была выбрана, скрипт немедленно открывает второй Out-ConsoleGridView, который показывает уже файлы внутри этой папки.

  3. Вы выбираете один или несколько файлов клавишей Space и нажимаете Enter.

  4. Скрипт берет выбранные файлы и создает из них ZIP-архив на вашем рабочем столе.

Это превращает сложную многошаговую задачу (найти папку, найти в ней файлы, скопировать их пути, запустить команду архивации) в интуитивно понятный интерактивный процесс из двух шагов.


Пример 9: Управление опциональными компонентами Windows

Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView Powershell, Microsoft, Автоматизация, Системное администрирование, IT, Windows, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Вы можете легко найти и отключить ненужные компоненты, например Telnet-Client или Windows-Sandbox.

Пример 10: Управление виртуальными машинами Hyper-V

Быстро остановить несколько виртуальных машин для обслуживания хоста.

Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView Powershell, Microsoft, Автоматизация, Системное администрирование, IT, Windows, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Статья на github

Clear-DownloadsFolder.ps1

Полезно? Подпишись.
Понравилось — ставь «+»
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Серия постов о PowerShell

Показать полностью 6 7
15

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView)

Дисклеймер. В пикабу нет редактора кода - поэтому такое форматирование и картинки. В конце поста я дам ссылку на github. Почитайте, и если вам интересно, смотрите код на гитхабе.

Каждый раз, когда вы делаете фотографию, ваша камера записывает в файл не только само изображение, но и служебную информацию: модель камеры и объектива, дату и время съемки, выдержку, диафрагму, ISO, GPS-координаты. Эти данные называются EXIF (Exchangeable Image File Format).

Хотя PowerShell имеет встроенные средства для чтения некоторых метаданных, они ограничены. Чтобы получить доступ ко всей информации, нужен специализированный инструмент. В этой статье я использую ExifTool.

ExifTool — это бесплатная, кросс-платформенная утилита с открытым исходным кодом, написанная Филом Харви. Она является золотым стандартом для чтения, записи и редактирования метаданных в самых разных форматах файлов (изображения, аудио, видео, PDF и др.). ExifTool знает тысячи тегов от сотен производителей устройств, что делает его самым всеобъемлющим инструментом в своем классе.

Скачивание ExifTool и правильная настройка

Прежде чем писать код, нужно подготовить саму утилиту.

  1. Зайдите на официальный сайт ExifTool: https://exiftool.org/. На главной странице найдите и скачайте "Windows Executable".

  2. Переименование (Критически важный шаг!): Скачанный файл будет называться exiftool(-k).exe. Это не случайность, а специальная функция для удобства пользователей, которые работают с программой через графический интерфейс Windows, а не через командную строку.

Переименуйте его в exiftool.exe, чтобы отключить режим "паузы", который предназначен для пользователей, запускающих программу двойным щелчком мыши. Когда вы запускаете программу из скрипта, PowerShell ожидает, что она выполнит свою задачу, вернет результат (текст, данные) и завершится. Режим с паузой (-k) нарушает этот процесс

Хранение: У вас есть два основных варианта, где хранить exiftool.exe.

  • Вариант 1 (Простой): В той же папке, что и ваш скрипт. Это самый легкий путь. Ваш скрипт PowerShell всегда сможет найти утилиту, так как она лежит рядом. Идеально для портативных скриптов, которые вы переносите с компьютера на компьютер.

  • Вариант 2 (Рекомендуемый для частого использования): В папке из системной переменной PATH. Переменная PATH — это список директорий, где Windows и PowerShell автоматически ищут исполняемые файлы. Вы можете создать папку (например, C:\Tools), положить туда exiftool.exe и добавить C:\Tools в системную переменную PATH. После этого вы сможете вызывать exiftool.exe из любой папки в любой консоли.

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

скрипты для добавления в $PATH:
Добавление директории в PATH для ТЕКУЩЕГО ПОЛЬЗОВАТЕЛЯ
Добавление директории в СИСТЕМНЫЙ PATH для ВСЕХ ПОЛЬЗОВАТЕЛЕЙ

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

PowerShell и внешние программы

Чтобы эффективно использовать ExifTool, нужно знать, как PowerShell запускает внешние .exe файлы. Правильный и самый надежный способ запуска внешних программ — это оператор вызова & (амперсанд). PowerShell выдаст ошибку в случае, если путь к программе содержит пробелы. Например, C:\My Tools\exiftool.exe. & (амперсанд)** говорит PowerShell: "Текст, который следует за мной в кавычках, — это путь к исполняемому файлу. Запусти его, а всё, что идет дальше, — это его аргументы".

# Правильный синтаксис
> & "C:\Path With Spaces\program.exe" "аргумент 1" "аргумент 2"

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

ExifTool + PowerShell

Теперь объединим наши знания.

Пример №1: Базовое извлечение и интерактивный просмотр

Самый простой способ получить все данные из фото и изучить их — это запросить их в формате JSON и передать в Out-ConsoleGridView (ogv).

Путь к фото
> $photoPath = "E:\photos\1234.png"

1. Запускаем exiftool с ключом -json для структурированного вывода
2. Преобразуем JSON-текст в объект PowerShell
Вызываем exiftool.exe напрямую, без переменной и оператора вызова &.
> $exifObject = exiftool.exe -json $photoPath | ConvertFrom-Json

3. Превращаем "широкий" объект в удобную таблицу "Параметр-Значение"
> $reportData = $exifObject.psobject.Properties | Select-Object Name, Value

4. Выводим результат в интерактивное окно для анализа
> $reportData | Out-ConsoleGridView -Title "Метаданные файла: $($photoPath | Split-Path -Leaf)"

Этот код откроет интерактивное окно, где вы сможете отсортировать данные по имени параметра или значению, а также отфильтровать их, просто начав вводить текст. Это невероятно удобно для быстрого поиска нужной информации.


Пример №2: Создание чистого отчета и отправка на разные "устройства"

Out-ConsoleGridView — это только начало. Вы можете направить обработанные данные куда угодно, используя другие командлеты Out-*.

Предположим, у нас есть данные в переменной $reportData из предыдущего примера.

А) Отправка в CSV-файл для Excel
Создаем директорию Reports:
> New-Item -Path "C:\Reports" -ItemType Directory
Сохраняем CSV
> $reportData | Export-Csv -Path "C:\Reports\photo_exif.csv" -NoTypeInformation -Encoding UTF8

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

В) Отправка в буфер обмена

Хотите быстро вставить данные в письмо или чат? Используйте Out-Clipboard.
> $reportData | Format-Table -AutoSize | Out-String | Out-Clipboard
Теперь вы можете нажать `Ctrl+V` в любом текстовом редакторе и вставить аккуратно отформатированную таблицу.


Пример №3: Получение конкретных данных для использования в скрипте

Часто вам не нужен весь отчет, а лишь одно или два значения. Поскольку $exifObject — это обычный объект PowerShell, вы можете легко обращаться к его свойствам.

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Пример №4: Пакетное извлечение метаданных из папки

Иногда нужно проанализировать не одно фото, а целую папку с изображениями.

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Пример №5: Рекурсивный поиск по подпапкам

ExifTool умеет сам искать файлы во всех подпапках при использовании ключа -r.

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Пример №6: Переименование файлов по дате съемки

Это один из самых популярных сценариев автоматизации — файлы получают имена по дате/времени съемки.

> $exifToolPath = "C:\Tools\exiftool.exe" $photoFolder = "D:\Photos" # Переименуем в формат YYYY-MM-DD_HH-MM-SS.jpg & $exifToolPath -r -d "%Y-%m-%d_%H-%M-%S.%%e" "-FileName<DateTimeOriginal" $photoFolder

💡 ExifTool подставит расширение исходного файла автоматически через %%e.

Пример №7: Извлечение только GPS-координат

Полезно, если вы хотите построить карту по вашим фото.

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Пример №8: Массовое удаление всех GPS-данных (для приватности)

# Удалим все GPS-теги из JPG и PNG
> & $exifToolPath -r -overwrite_original -gps:all= "D:\Photos"

💡 Это действие необратимо, поэтому делайте бэкап перед выполнением.


Пример №9: Конвертация времени съемки в местное время

Иногда фото сняты в другом часовом поясе. ExifTool может сместить дату.

# Смещаем время на +3 часа
> & $exifToolPath "-AllDates+=3:0:0" "D:\Photos\IMG_*.JPG"


Пример №13: Копирование метаданных с одного файла на другой

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Пример №14: Сохранение исходных метаданных в отдельный JSON перед изменением

> $backupPath = "C:\Reports\metadata_backup.json" & $exifToolPath -r -json "D:\Photos" | Out-File -Encoding UTF8 $backupPath


Пример №15: Использование PowerShell для автоматической сортировки фото по дате

Серия «Философия PowerShell». Полное руководство по ExifTool и PowerShell (Out-ConsoleGridView) Powershell, Инструкция, Админ, Системное администрирование, Обработка фотографий, Автоматизация, Скрипт, IT, Программирование, Гайд, Видео, Без звука, Короткие видео, Длиннопост

Пример 16: Поиск всех уникальных моделей камер в коллекции

Хотя это можно сделать одной строкой, вывод в GridView позволяет сразу скопировать нужное название модели.

Ключ -s3 выводит только значения, -Model - название тега
> $uniqueModels = & exiftool.exe -r -Model -s3 "D:\Photos" | Sort-Object -Unique
Выводим в GridView для удобного просмотра и копирования
> $uniqueModels | Out-ConsoleGridView -Title "Уникальные модели камер в коллекции"

Статья на github

Еще по теме Out-ConsoleGridView:

Философия PowerShell. Часть 4. Интерактивная работа: Out-ConsoleGridView
Серия «Философия PowerShell». Практические примеры использования Out-ConsoleGridView

Вся Серия постов о PowerShell

Полезно? Подпишись.
Понравилось — ставь «+»
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Показать полностью 9 4
11

А давайте встроим ии в powershell

Дисклеймер. В пикабу нет редактора кода - поэтому такое форматирование и картинки. В конце поста я дам ссылку на github. Почитайте, и если вам интересно, смотрите код на гитхабе.

Под аббревиатурой «ии» я подразумеваю модель машинного обучения. Я буду использовать gemini-2.5-pro/flash. У гугла есть интерфейс командной строки gemini-cli.

Что такое Gemini CLI?

Подробно о Gemini CLI я уже рассказывал в Gemini CLI: Знакомство и первые шаги. Но если вы ее пропустили, вот краткое введение.

Если коротко, Gemini CLI — это командная строка для взаимодействия с моделями ИИ от Google. Вы запускаете его в своем терминале, и он превращается в чат, который, в отличие от веб-версий, имеет доступ к вашей файловой системе.

Ключевые возможности:

  • Понимает код: Он может анализировать ваши скрипты, находить в них ошибки и предлагать исправления.

  • Генерирует код: Вы можете попросить его написать PowerShell-скрипт для решения вашей задачи, и он это сделает.

  • Работает с файлами: Может читать файлы, создавать новые, вносить изменения в существующие.

  • Запускает команды: Может выполнять команды оболочки, такие как git или npm.

Для наших целей самое важное то, что Gemini CLI умеет работать в неинтерактивном режиме. То есть мы можем передать ему промпт как аргумент командной строки, и он просто вернет нам ответ, не запуская свой интерактивный чат. Именно эту возможность мы и будем использовать.

Установка и настройка

Чтобы начать, нам нужно подготовить наше окружение. Это делается один раз.

Шаг 1: Установка Node.js Gemini CLI — это приложение, написанное на Node.js (популярная среда для JavaScript). Поэтому сначала нам нужно установить саму Node.js.

  1. Перейдите на официальный сайт: https://nodejs.org/

  2. Скачайте и установите LTS версию. Это самый стабильный и рекомендуемый вариант. Просто следуйте инструкциям установщика.

  3. После установки откройте новое окно PowerShell и проверьте, что все работает:

    node -v npm -v

    Вы должны увидеть версии, например, v20.12.2 и 10.5.0.

Шаг 2: Установка самого Gemini CLI Теперь, когда у нас есть npm (менеджер пакетов для Node.js), установка Gemini CLI сводится к одной команде. Выполните ее в PowerShell:

npm install -g @google/gemini-cli

Флаг -g означает "глобальная установка", что сделает команду gemini доступной из любого места в вашей системе.

Шаг 3: Аутентификация В первый раз, когда вы запустите Gemini CLI, он попросит вас войти в свой аккаунт Google. Это нужно, чтобы он мог использовать вашу бесплатную квоту.

  1. Просто введите в PowerShell команду:

    gemini

  2. Он задаст вам вопрос о входе. Выберите "Sign in with Google".

  3. В вашем браузере откроется стандартное окно входа Google. Войдите в свой аккаунт и предоставьте необходимые разрешения.

  4. После этого в консоли вы увидите приветственное сообщение от Gemini. Поздравляю, вы готовы к работе! Можете ввести /quit, чтобы выйти из его чата.

Философия PowerShell: ужасный Invoke-Expression

Прежде чем мы соединим все вместе, познакомимся с одним из самых опасных командлетов в PowerShell — Invoke-Expression, или его коротким псевдонимом iex.

Invoke-Expression берет текстовую строку и выполняет ее так, как будто это была команда, напечатанная в консоли.

Пример:

$commandString = "Get-Process -Name 'chrome'" Invoke-Expression -InputObject $commandString

Эта команда сделает то же самое, что и простой вызов Get-Process -Name 'chrome'.

Почему он опасный? Потому что выполнение строки, которую вы не контролируете (например, полученной из интернета или от ИИ), — это огромная дыра в безопасности. Если ИИ по ошибке или со злым умыслом вернет команду Remove-Item -Path C:\ -Recurse -Force, iex без раздумий ее выполнит.

Для нашей задачи — создания управляемого и контролируемого моста между запросом на естественном языке и его выполнением — он подходит идеально. Мы будем использовать его с осторожностью, полностью осознавая риски.

Соединяем всё вместе: командлет Invoke-Gemini

Напишем простую PowerShell-функцию, которая позволит нам отправлять промпты одной командой.

А давайте встроим ии в powershell Windows, Автоматизация, Системное администрирование, Cli, Gemini, Powershell, Гайд, IT, Видео, Без звука, Короткие видео, Длиннопост

Давайте зададим ему вопрос на общую тему прямо из нашей PowerShell-консоли.

Invoke-Gemini -Prompt "Расскажи о пяти последних трендах в области машинного обучения"
Пробуем магию:

👏 Поздравляю! Вы только что успешно встроили ИИ в PowerShell.

В следующей статье я расскажу, как использовать Gemini CLI для запуска скриптов и автоматизации задач.

Ссылка на github

Серия «Философия PowerShell»
Серия «gemini-cli»

Полезно? Подпишись.
Понравилось — ставь «+»
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Показать полностью 1 1
7

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Интерфейс командной строки программы

В прошлый раз мы увидели, как с помощью powershell можем взаимодействовать с моделью Gemini через интерфейс командной строки. В этой статье я покажу как извлечь пользу из наших знаний. Сегодня мы соберем интерактивный справочник, который на вход будет принимать параметры компонента (марка, модель, категория, артикул и т. п.), а возвращать интерактивную таблицу с характеристиками, полученную от модели Gemini.

Что нам понадобится:
Gemini-CLI
OutConsoleGridView

Дисклеймер. В пикабу нет редактора кода - поэтому такое форматирование и картинки. В конце поста я дам ссылку на github. Почитайте, и если вам интересно, смотрите код на гитхабе.

Инженеры, разработчики и другие специалисты сталкиваются с тем, что нужно узнать точные параметры, например материнской платы, автомата в электрощитке или сетевого коммутатора. Наш справочник всегда будет под рукой и по запросу соберет информацию, уточнит параметры в интернете и вернет искомую таблицу. В таблице можно выбрать необходимый параметр/ы и по необходимости продолжить углубленный поиск. В дальнейшем мы научимся передавать результат по конвейеру для дальнейшей обработки: экспорта в таблицу Excel, Google таблицу, хранения в базе данных или передачи в другую программу В случае неудачи модель посоветует, какие параметры надо уточнить. Впрочем, смотрите сами:

Шаг 1: Настройка

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Назначение строк:

  • $env:GEMINI_API_KEY = "..." — устанавливает API ключ для доступа к Gemini AI

  • if (-not $env:GEMINI_API_KEY) — проверяет наличие ключа, завершает работу если его нет

  • $scriptRoot = Get-Location — получает текущую рабочую директорию

  • $HistoryDir = Join-Path... — формирует путь к папке для хранения истории диалогов (.gemini/.chat_history)

  • $timestamp = Get-Date... — создает временную метку в формате 2025-08-26_14-30-15

  • $historyFileName = "ai_session_$timestamp.jsonl" — генерирует уникальное имя файла сессии

  • $historyFilePath = Join-Path... — создает полный путь к файлу истории текущей сессии

Проверка окружения — что должно быть установлено.

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Что проверяется:

  • Наличие Gemini CLI в системе — без него скрипт не работает

  • Файл GEMINI.md — содержит системный промпт (инструкции для AI)

  • Файл ShowHelp.md — справка для пользователя (команда ?)

Основная функция взаимодействия с AI.

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Задачи функции:

  • Вызывает Gemini CLI с указанной моделью и промптом

  • Захватывает все выводы (включая ошибки)

  • Очищает результат от служебных сообщений CLI

  • Возвращает чистый ответ AI или $null при ошибке

Функции управления историей.

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Назначение:

  • Add-History — сохраняет пары «вопрос-ответ» в JSONL формате

  • Show-History — показывает содержимое файла истории

  • Clear-History — удаляет файл истории текущей сессии

Функция отображения выбранных данных

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Show-SelectionTable

Задача функции: После выбора элементов в Out-ConsoleGridView показывает их в консоли в виде аккуратной таблицы, чтобы пользователь видел, что именно выбрал.

Основной рабочий цикл.

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Основой цикл программы

Ключевые особенности:

  • Индикатор [Выборка активна] показывает, что есть данные для анализа

  • Каждый запрос включает всю историю диалога для поддержания контекста

  • AI получает и историю, и выбранные пользователем данные

  • Результат пытается отобразиться как интерактивная таблица

  • При неудаче парсинга JSON показывается обычный текст

Структура рабочей директории.

А давайте встроим ии в powershell. Часть вторая. Поисковик спецификаций Программирование, IT, Гайд, Powershell, Gemini, Программа, Скрипт, Искусственный интеллект, Системный аналитик, Системное администрирование, Видео, Без звука, Длиннопост

Проследим весь жизненный цикл нашего скрипта - что происходит с момента запуска и до получения результатов.

Инициализация: подготовка к работе

При запуске скрипт первым делом настраивает рабочее окружение. Он устанавливает API ключ для доступа к Gemini AI, определяет текущую папку как базовую директорию и создает структуру для хранения файлов. Особое внимание уделяется истории диалогов - для каждой сессии создается уникальный файл с временной меткой, например ai_session_2025-08-26_14-30-15.jsonl.

Затем система проверяет, что все необходимые инструменты установлены. Она ищет Gemini CLI в системе, проверяет наличие файлов конфигурации (системный промпт и справка). Если что-то критично важное отсутствует, скрипт предупреждает пользователя или завершает работу.

Запуск интерактивного режима

После успешной инициализации скрипт переходит в интерактивный режим - показывает приветственное сообщение и ждет ввода от пользователя. Приглашение выглядит как 🤖AI :) > и меняется на 🤖AI [Выборка активна] :) > когда у системы есть данные для анализа.

Обработка пользовательского ввода

Каждый ввод пользователя сначала проверяется на служебные команды через функцию Command-Handler. Эта функция распознает команды ? (справка из файла ShowHelp.md), history (показать историю сессии), clear и clear-history (очистить файл истории), gemini help (справка по CLI), exit и quit (выход). Если это служебная команда, она выполняется немедленно без обращения к AI, и цикл продолжается.

Если это обычный запрос, система начинает формировать контекст для отправки в Gemini. Она читает всю историю текущей сессии из JSONL файла (если он существует), добавляет блок с данными из предыдущей выборки (если есть активная выборка), и объединяет все это с новым запросом пользователя в структурированный промпт с разделами "ИСТОРИЯ ДИАЛОГА", "ДАННЫЕ ИЗ ВЫБОРКИ" и "НОВАЯ ЗАДАЧА". После использования данные выборки обнуляются.

Взаимодействие с искусственным интеллектом

Сформированный промпт отправляется в Gemini через командную строку. Система вызывает gemini -m модель -p промпт, захватывает весь вывод и очищает его от служебных сообщений CLI. Если происходит ошибка на этом этапе, пользователь получает предупреждение, но скрипт продолжает работать.

Обработка ответа AI

Полученный от AI ответ система пытается интерпретировать как JSON. Сначала она ищет блок кода в формате json..., извлекает содержимое и пытается его распарсить. Если такого блока нет, парсит весь ответ целиком. При успешном парсинге данные отображаются в интерактивной таблице Out-ConsoleGridView с заголовком "Выберите строки для следующего запроса (OK) или закройте (Cancel)" и множественным выбором. Если JSON не распознается (ошибка парсинга), ответ показывается как обычный текст в голубом цвете.

Работа с выборкой данных

Когда пользователь выбирает строки в таблице и нажимает OK, система выполняет несколько действий. Сначала вызывается функция Show-SelectionTable, которая анализирует структуру выбранных данных: если это объекты с свойствами, она определяет все уникальные поля и показывает данные через Format-Table с автоподбором размера и переносом. Если это простые значения, отображает их как нумерованный список. Затем выводит счетчик выбранных элементов и сообщение "Выборка сохранена. Добавьте ваш следующий запрос (например, 'сравни их')".

Выбранные данные преобразуются в сжатый JSON с глубиной вложенности 10 уровней и сохраняются в переменной $selectionContextJson для использования в следующих запросах к AI.

Ведение истории

Каждая пара "запрос пользователя - ответ AI" сохраняется в файл истории в формате JSONL. Это обеспечивает непрерывность диалога - AI "помнит" весь предыдущий разговор и может ссылаться на ранее обсуждавшиеся темы.

Цикл продолжается

После обработки запроса система возвращается к ожиданию нового ввода. Если у пользователя есть активная выборка, это отражается в приглашении командной строки. Цикл продолжается до тех пор, пока пользователь не введет команду выхода.

Практический пример работы

Представим, что пользователь запускает скрипт и вводит "RTX 4070 Ti Super":

  1. Подготовка контекста: Система берет системный промпт из файла, добавляет историю (пока пустую) и новый запрос

  2. Обращение к AI: Полный промпт отправляется в Gemini с просьбой найти характеристики видеокарт

  3. Получение данных: AI возвращает JSON с массивом объектов, содержащих информацию о различных моделях RTX 4070 Ti Super

  4. Интерактивная таблица: Пользователь видит таблицу с производителями, характеристиками, ценами и выбирает 2-3 интересующие модели

  5. Отображение выборки: В консоли появляется таблица с выбранными моделями, приглашение меняется на [Выборка активна]

  6. Уточняющий запрос: Пользователь пишет "сравни производительность в играх"

  7. Контекстный анализ: AI получает и исходный запрос, и выбранные модели, и новый вопрос - дает детальное сравнение именно этих карт

Завершение работы

При вводе exit или quit скрипт корректно завершается, сохранив всю историю сессии в файл. Пользователь может в любой момент вернуться к этому диалогу, просмотрев содержимое соответствующего файла в папке .chat_history.

Вся эта сложная логика скрыта от пользователя за простым интерфейсом командной строки. Человек просто задает вопросы и получает структурированные ответы, а система берет на себя всю работу по поддержанию контекста, парсингу данных и управлению состоянием диалога.

Серия «Философия PowerShell»
Серия «gemini-cli»

Полезно? Подпишись.
Понравилось — ставь «+»
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Показать полностью 7 1
Отличная работа, все прочитано!