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

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 и скачанными скриптами.

Три привычки после курса:

  1. Писать скрипты на полных именах cmdlet, алиасы оставить интерактиву.
  2. Явно указывать кодировку и пути с пробелами.
  3. Перед публикацией прогнать чек-лист качества и тест на копии данных.

Куда идти дальше

ТемаРаздел
Bash на LinuxBash — о разделе
Microsoft LearnPowerShell — о разделе (ссылки на документацию)
Low-codeLow-code и No-code

Проверьте себя: Чек-лист самопроверки.


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").