Медленно запускается консоль PowerShell — что делать

Slowpowershell

Время запуска консоли PowerShell в Windows 10 и 11 составляет в среднем 0.3 секунды, однако в некоторых случаях запуск этого нетребовательного системного приложения может занять 1-2 минуты, а иногда даже дольше. Что может вызвать такое поведение консоли и как восстановить ее нормальную работу? По большому счету, основных причин медленного запуска PowerShell четыре.

Запуск пользовательских функций в профилях, автозагрузка PS-модулей, раздувшийся файл истории команд и повреждение компонентов .NET Framework.

Как определить точное время запуска PowerShell

С помощью командлета Measure-Command.

Полная команда, выводящая время запуска консоли в секундах, выглядит следующим образом:

powershell -noprofile -ExecutionPolicy Bypass ( Measure-Command { powershell "Write-Host 1" } ).TotalSeconds

В нашем примере консоль загрузилась за 0,5344133 секунды, что вполне нормально.

Measure-Command

Если консоль запускается значительно дольше, стоит поискать причину и устранить ее.

Системные и пользовательские профили

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

Определить, являются ли они причиной медленного запуска консоли, нетрудно, достаточно выполнить команду powershell.exe -noprofile или pwsh.exe -noprofile, а затем заново замерить скорость загрузки.

Powershell noprofile

Если скорость заметно снизилась, начинаем разбираться с профилями.

Выводим их список командой $profile | select *, открываем файлы .ps1 текстовым редактором и смотрим, что там внутри.

Возможно, какие-то содержащиеся в них команды вам не нужны.

Избавляемся от них.

Модули PowerShell

Примерно то же самое касается установленных модулей.

Чтобы разобраться с ними, используете эти команды:

  • $Env:PSModulePath -split ';' — выводит список каталогов, из которых загружаются модули.
  • Get-Module -ListAvailable — выводит список всех загруженных в память модулей.
  • Get-InstalledModule — выводит список всех сторонних модулей.
  • Remove-Module -Name NAME — выгружает модуль из сессии без удаления с компьютера. NAME — название модуля.
  • Uninstall-Module -Name NAME -AllVersions -Force — полностью удаляет модуль из системы.
  • Measure-Command { Import-Module NAME -Force } — показывает время загрузки конкретного модуля.

ModulePath

Import-Module

Дополнительные проверки

Проверьте размер файла истории команд ConsoleHost_history.txt, расположенного по адресу:

%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine

Удалите лог, если его размер превышает 50 Мб.

ConsoleHost_history

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

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

Вам понадобятся две команды:

  • powershell.exe -c "Write-Host $PID;Start-Sleep -s 60" — определяет идентификатор процесса PowerShell.
  • Get-Process | where {$_.Id -eq <ваш_идентификатор>} | select -ExpandProperty modules — выводит список модулей и библиотек, используемых консолью.

Если в списке присутствует библиотека антивирусной программы, внесите исполняемые файлы powershell.exe и pwsh.exe в список исключения антивируса.

ExpandProperty modules

Если положительного результата достигнуть не удалось, переустановите компоненты .NET Framework.

Возможно, проблема вызывается повреждением их файлов.

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

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