PowerShell — итоги
Кратко — что стоит унести из раздела "PowerShell". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные сбои и ситуации после раздела, плюс запросы из поиска ("execution policy", "Get-ChildItem", "PowerShell 7 vs 5.1"). Здесь — краткий ответ и ссылка на главу; определения для зачёта — в чек-листе.
Вопрос. .\script.ps1 — "running scripts is disabled on this system".
Ответ. Сработала политика выполнения (Execution Policy). Для своих скриптов на учебной машине часто достаточно RemoteSigned в scope CurrentUser; в проде — подпись и GPO, а не отключение защиты вслепую. Подробнее здесь — первая программа, рекомендации, Опасные скрипты.
Вопрос. Команда pwsh не найдена, хотя "PowerShell установлен".
Ответ. В Windows по умолчанию есть Windows PowerShell 5.1 (powershell.exe), а PowerShell 7+ ставится отдельно как pwsh. Проверьте $PSVersionTable. Подробнее здесь — оглавление, история.
Вопрос. Скрипт на 5.1 падает на 7 с ошибкой модуля или синтаксиса.
Ответ. Часть модулей (старые Snap-in, отдельные WMI-обёртки) привязана к .NET Framework и 5.1. Укажите целевую версию в README и тестируйте на той же, что в проде. Подробнее здесь — оглавление, модули.
Вопрос. Записал $items = "a","b","c" — в конвейере один объект вместо трёх.
Ответ. Запятая создаёт массив; без неё "a" "b" склеивается. Для одного элемента-массива используйте @("a") или запятую после единственного элемента. Подробнее здесь — типы и переменные, объекты и конвейер.
Вопрос. if ($count) ведёт себя странно при $count = 0.
Ответ. 0 в условии даёт $false. Для проверки наличия используйте $null -ne $count или явное сравнение. Подробнее здесь — условия, типы.
Вопрос. В конвейере $_ пустой или "не существует".
Ответ. $_ доступен только внутри блока process конвейера (ForEach-Object, Where-Object, catch не подменяют его). В именованном скриптблоке укажите param($_) или $PSItem. Подробнее здесь — объекты и конвейер, функции.
Вопрос. Get-Process | Select Name — дальше свойство не находится, "как строка".
Ответ. После Select-Object тип объекта меняется. Сохраняйте полные объекты или указывайте свойства до форматирования. Format-Table в конце конвейера ломает передачу объектов дальше. Подробнее здесь — объекты и конвейер.
Вопрос. Out-File создал файл — Notepad++ показывает "мусор" или NUL между буквами.
Ответ. Out-File по умолчанию пишет UTF-16 LE. Для UTF-8: Set-Content -Encoding utf8 или Out-File -Encoding utf8. Подробнее здесь — синтаксис, файлы в практике.
Вопрос. try { ... } catch { } не ловит "ошибку" команды.
Ответ. Многие cmdlet пишут в Error stream без terminating exception. Настройте $ErrorActionPreference = 'Stop' или -ErrorAction Stop на критичных шагах. Подробнее здесь — ошибки и отладка.
Вопрос. Скрипт "успешно" завершился, но задача в планировщике помечена сбоем.
Ответ. Завершайте с явным exit 1 при ошибке; планировщик смотрит код выхода. Не полагайтесь только на красный текст в консоли. Подробнее здесь — ошибки, триггеры, рекомендации.
Вопрос. Invoke-WebRequest падает на HTTPS с корпоративным прокси.
Ответ. Проверьте доверие к корневому CA, прокси (-Proxy), TLS 1.2+. В учебной среде не отключайте проверку сертификата в прод-скриптах. Подробнее здесь — практика, интеграция в автоматизации.
Вопрос. Пароль в скрипте как ConvertTo-SecureString в открытом виде — так нормально?
Ответ. Строка в файле — секрет для всех, кто читает репозиторий. Используйте SecretManagement, Credential Manager, переменные CI. Подробнее здесь — секреты, рекомендации.
Вопрос. Путь C:\Program Files\App без кавычек обрезается на C:\Program.
Ответ. Пробелы требуют кавычек или -LiteralPath. Для надёжности — Join-Path и -LiteralPath в cmdlet файловой системы. Подробнее здесь — синтаксис, первая программа.
Вопрос. Import-Module Az — "module not found".
Ответ. Модуль не установлен в scope пользователя или стоит только для другой версии PS. Install-Module для нужного pwsh, проверьте $env:PSModulePath. Подробнее здесь — модули, утилиты.
Вопрос. Write-Host есть в скрипте, в логе задачи пусто.
Ответ. Write-Host идёт в host, не в поток для перенаправления. Для логов — Write-Output, Write-Verbose, Start-Transcript. Подробнее здесь — рекомендации, ошибки.
Вопрос. ConvertFrom-Json на большом файле "висит" или ест всю память.
Ответ. Весь JSON загружается в объекты .NET. Для больших файлов — потоковый разбор, -Depth при сериализации, или NDJSON. Подробнее здесь — конфигурация, объекты.
Вопрос. Задача в Планировщике Windows не запускает скрипт под моим пользователем.
Ответ. Укажите учётную запись, "выполнять с наивысшими правами" только если нужно, рабочую папку и полный путь к powershell.exe / pwsh.exe с -File. Интерактивный профиль не загружается. Подробнее здесь — триггеры, практическая автоматизация.
Вопрос. Enter-PSSession на второй сервер — доступ к сетевой папке пропадает (double hop).
Ответ. Учётные данные не пересылаются по цепочке remoting по умолчанию. Нужен CredSSP (осторожно), JEA или выполнение на целевом узле без второго hop. Подробнее здесь — экосистема, рекомендации.
Вопрос. Антивирус удалил или заблокировал .ps1 после сохранения.
Ответ. Эвристика часто реагирует на обфусцированный или скачанный скрипт. Подписывайте свои файлы, храните в доверенном пути, не обходите AV "для удобства" на рабочей машине. Подробнее здесь — Опасные скрипты.
Вопрос. Парсер ругается "Missing closing '}'" — визуально скобки на месте.
Ответ. Ищите незакрытую строку выше по файлу, here-string @' ... '@ без закрытия, лишнюю ) в параметрах. powershell -NoProfile -Command "& { . .\script.ps1 }" для локализации строки. Подробнее здесь — синтаксис, отладка.
Вопрос. В скрипте использую ls и cd — коллега говорит, что так нельзя.
Ответ. Это алиасы; в переносимых скриптах пишите Get-ChildItem, Set-Location. В интерактиве алиасы допустимы. Подробнее здесь — основы, рекомендации.
Вопрос. Get-Content .\file.txt — кириллица превратилась в "ромбики".
Ответ. Укажите кодировку: Get-Content -Encoding utf8 (в PS 5.1 поведение UTF-8 отличалось — проверьте версию). Подробнее здесь — типы, синтаксис.
Вопрос. Нужно "просто выполнить функции" из .ps1 — .\script.ps1 не меняет переменные в сессии.
Ответ. Точка в начале: . .\script.ps1 (dot sourcing) выполняет в текущей области. Без точки — дочерняя область. Подробнее здесь — функции, основы.
Вопрос. Конфиг в JSON правлю руками — скрипт читает старые значения.
Ответ. Кэш не у PowerShell, а у процесса, который держит файл, или скрипт читает другой путь. Логируйте $PSScriptRoot и полный путь к config. Подробнее здесь — конфигурация, блоки.
Вопрос. Where-Object { $_.Size -gt 1MB } на тысячах файлов тормозит.
Ответ. Фильтруйте на источнике: Get-ChildItem -Filter, -Recurse с осторожностью, параметр -Filter у cmdlet, где есть. Меньше объектов в конвейере — быстрее. Подробнее здесь — объекты и конвейер, утилиты.
Вопрос. Скопировал пример с = вместо -eq — сравнение "присваивает".
Ответ. В условиях используйте операторы сравнения -eq, -ne, -like; одиночное = — присваивание. Подробнее здесь — условия, синтаксис.
Вопрос. После раздела хочу автоматизировать AD/Azure — с чего начать без хаоса?
Ответ. Пройдите практическую модель (цель, триггер, окупаемость), затем рекомендации и один модуль из 121. Один рабочий сценарий лучше десяти полускриптов. Подробнее здесь — оглавление, блоки.
Вопрос. Что такое PowerShell и чем он отличается от cmd?
Ответ. PowerShell — объектная оболочка на .NET с cmdlet; cmd — текстовые команды DOS-наследия. Для автоматизации Windows и облака выбирают PowerShell. Подробнее здесь — основы, история, оглавление.
Вопрос. PowerShell 7 и Windows PowerShell 5.1 — в чём разница?
Ответ. 5.1 встроен в Windows (.NET Framework); 7+ (pwsh) кроссплатформенный и на современном .NET. Проверка: $PSVersionTable. Подробнее здесь — оглавление, история.
Вопрос. Как запустить ps1-скрипт в Windows — двойной клик не работает?
Ответ. Из консоли: powershell -File script.ps1 или .\script.ps1 при разрешённой Execution Policy. Подробнее здесь — первая программа.
Вопрос. Execution Policy PowerShell — как разрешить локальные скрипты?
Ответ. Для учёбы на своём ПК: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser. В организации — политика GPO и подпись. Подробнее здесь — первая программа, рекомендации.
Вопрос. Get-ChildItem — аналог dir и ls в PowerShell?
Ответ. Да, Get-ChildItem (алиасы dir, ls) возвращает объекты файловой системы с свойствами, не просто текст. Подробнее здесь — основы, командлеты.
Вопрос. Конвейер PowerShell — как работает pipe между cmdlet?
Ответ. Передаются объекты .NET, не строки: Get-Process | Where-Object CPU -gt 100. Подробнее здесь — объекты и конвейер.
Вопрос. ForEach-Object и foreach в PowerShell — когда что?
Ответ. foreach ($x in $arr) — по коллекции в памяти; ForEach-Object — в конвейере, по одному объекту из pipe. Подробнее здесь — условия и циклы, объекты.
Вопрос. Переменные в PowerShell — $name и типы?
Ответ. Переменные с $, типы задаются [string], [int] или выводятся автоматически. Подробнее здесь — типы и переменные.
Вопрос. ConvertFrom-Json и ConvertTo-Json — разбор JSON в скрипте?
Ответ. Get-Content file.json | ConvertFrom-Json даёт объекты; обратно — ConvertTo-Json -Depth 5. Подробнее здесь — объекты, конфигурация.
Вопрос. Invoke-WebRequest и Invoke-RestMethod — запрос к API?
Ответ. Invoke-RestMethod часто сразу парсит JSON/XML; Invoke-WebRequest — полный ответ с заголовками. Подробнее здесь — утилиты и примеры, практика.
Вопрос. Как удалить файлы и папки в PowerShell — не через cmd?
Ответ. Remove-Item -Path "C:\temp\*" -Recurse -Force — осторожно с -Force; сначала Get-ChildItem без удаления. Подробнее здесь — основы, рекомендации.
Вопрос. Скопировать папку рекурсивно — Copy-Item?
Ответ. Copy-Item -Path src -Destination dst -Recurse. Для зеркалирования смотрите robocopy или специализированные cmdlet. Подробнее здесь — основы, утилиты.
Вопрос. PowerShell — перезапустить службу Windows?
Ответ. Restart-Service -Name "wuauserv" (пример); список — Get-Service. Нужны права администратора. Подробнее здесь — утилиты, экосистема.
Вопрос. Запуск скрипта по расписанию — Планировщик и PowerShell?
Ответ. Задача с действием powershell.exe -File "C:\scripts\task.ps1"` или триггеры из 126. Подробнее здесь — триггеры, практическая автоматизация.
Вопрос. PowerShell Remoting — Enter-PSSession на другой ПК?
Ответ. Нужен WinRM, доверие хостов, права. Enter-PSSession -ComputerName srv — интерактивная сессия; для скриптов — Invoke-Command. Подробнее здесь — экосистема, рекомендации.
Вопрос. Как установить модуль PowerShell — Install-Module?
Ответ. Install-Module -Name Az -Scope CurrentUser, затем Import-Module. Репозиторий — PSGallery. Подробнее здесь — модули, утилиты.
Вопрос. Профиль PowerShell — где хранится $PROFILE?
Ответ. Путь в $PROFILE (часто Documents\PowerShell\Microsoft.PowerShell_profile.ps1) — автозагрузка alias и функций при старте. Подробнее здесь — основы, рекомендации.
Вопрос. Запуск PowerShell от имени администратора для скрипта?
Ответ. ПКМ по терминалу — "от администратора"; в скрипте проверка #Requires -RunAsAdministrator. Минимизируйте постоянный запуск elevated. Подробнее здесь — рекомендации, секреты.
Вопрос. PowerShell и Azure — с чего начать автоматизацию?
Ответ. Модуль Az, Connect-AzAccount, cmdlet вместо портала для повторяемых задач. Сначала 124 про цель автоматизации. Подробнее здесь — утилиты, экосистема.
Вопрос. PowerShell в Excel — прочитать ячейки без VBA?
Ответ. Через COM (New-Object -ComObject Excel.Application) или экспорт в CSV и Import-Csv. Подробнее здесь — утилиты, объекты.
Вопрос. Изменить ключ реестра PowerShell — Set-ItemProperty?
Ответ. Драйвер Registry:, пути HKLM:\...; на проде — бэкап и тест. Подробнее здесь — основы, утилиты.
Вопрос. Параметры в функции PowerShell — param и ValidateSet?
Ответ. Блок param([string]$Name) в начале; advanced functions — атрибуты [Parameter()]. Подробнее здесь — функции, синтаксис.
Вопрос. Select-Object, Where-Object, Sort-Object — базовый конвейер?
Ответ. Три cmdlet для фильтрации, проекции полей и сортировки объектов в pipe. Подробнее здесь — объекты и конвейер, командлеты.
Вопрос. PowerShell на Linux — зачем pwsh на сервере Ubuntu?
Ответ. Единый язык автоматизации для гибридных сред и CI; часть модулей только под Windows. Подробнее здесь — оглавление, Bash — о разделе.
Вопрос. Как узнать все cmdlet по слову — Get-Command *Service*?
Ответ. Get-Command -Noun Service или поиск по глаголу; справка — Get-Help Restart-Service -Examples. Подробнее здесь — справочник, командлеты.
Вопрос. PowerShell vs Bash на сервере Linux — что учить?
Ответ. На Linux серверах чаще Bash; PowerShell полезен при гибриде Azure/AD и единых скриптов для Windows+Linux. Подробнее здесь — оглавление, Bash.
Что запомнить
PowerShell — оболочка и язык автоматизации с объектным конвейером (.NET): результат команды — не только текст, а типизированные объекты с свойствами и методами.
Ключевые опоры раздела:
- Две линейки — Windows PowerShell 5.1 и PowerShell 7 (
pwsh); проверяйте$PSVersionTable; - Cmdlet — глагол-существительное, параметры с
-Name,-ErrorAction Stopтам, где нужен жёсткий сбой; - Конвейер — объекты слева направо; не ставить
Format-*посередине цепочки; - Надёжность — terminating errors,
exitс кодом, логи не черезWrite-Host; - Безопасность — Execution Policy, секреты через 127, осторожность с remoting и скачанными скриптами.
Три привычки после курса:
- Писать скрипты на полных именах cmdlet, алиасы оставить интерактиву.
- Явно указывать кодировку и пути с пробелами.
- Перед публикацией прогнать чек-лист качества и тест на копии данных.
Куда идти дальше
| Тема | Раздел |
|---|---|
| Bash на Linux | Bash — о разделе |
| Microsoft Learn | PowerShell — о разделе (ссылки на документацию) |
| Low-code | Low-code и No-code |
Проверьте себя: Чек-лист самопроверки.
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). История PowerShell - эволюция платформы от Windows-оболочки до кроссплатформенного языка автоматизации. Простые приложения на PowerShell — скрипты Windows, файлы, JSON и REST. Экосистема автоматизации на PowerShell - установка, окружение и типовые инструменты для системных задач. Набор советов, правил, принципов и обычаев в разработке на этом языке. Основы языка PowerShell - синтаксис, объектный пайплайн и базовые подходы к автоматизации администрирования. PowerShell представляет собой среду командной строки и скриптовый язык, построенный на базе платформы .NET. $this — переменная, указывающая на текущий объект в методах классов. В PowerShell переменная $this используется внутри методов для обращения к свойствам и методам текущего экземпляра класса. Командлеты и встроенные функции PowerShell - устройство, принципы использования и расширение возможностей оболочки. Типизация, набор правил определения типа данных значений языка. Условные выражения и циклы в PowerShell - ветвление сценариев и управление повторяющимися операциями. Функции и продвинутые параметры в PowerShell - переиспользование кода, валидация аргументов и удобство CLI. Для динамического добавления свойств используется cmdlet Add-Member. Это позволяет расширять функциональность объектов без изменения их исходного кода.История PowerShell
Простые приложения на PowerShell
Экосистема автоматизации на PowerShell
Рекомендации по написанию PowerShell-скриптов
Основы языка PowerShell
Синтаксис и операторы PowerShell
Ключевые слова и управляющие конструкции
Командлеты и встроенные функции PowerShell
Типы данных и работа с переменными
Условные выражения и циклы
Функции и продвинутые параметры
Объектная модель и конвейерная обработка