Время запуска консоли 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 секунды, что вполне нормально.
Если консоль запускается значительно дольше, стоит поискать причину и устранить ее.
Системные и пользовательские профили
Профили PowerShell представляют собой файлы формата .ps1, содержащие настройки пользовательской среды консоли. Также они могут содержать команды, автоматически выполняемые при запуске PowerShell.
Определить, являются ли они причиной медленного запуска консоли, нетрудно, достаточно выполнить команду powershell.exe -noprofile или pwsh.exe -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 } — показывает время загрузки конкретного модуля.
Дополнительные проверки
Проверьте размер файла истории команд ConsoleHost_history.txt, расположенного по адресу:
%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine
Удалите лог, если его размер превышает 50 Мб.
Отключите антивирус и посмотрите, станет ли консоль загружаться быстрее.
Если да, добавьте загружаемые библиотеки в исключение.
Вам понадобятся две команды:
- powershell.exe -c "Write-Host $PID;Start-Sleep -s 60" — определяет идентификатор процесса PowerShell.
- Get-Process | where {$_.Id -eq <ваш_идентификатор>} | select -ExpandProperty modules — выводит список модулей и библиотек, используемых консолью.
Если в списке присутствует библиотека антивирусной программы, внесите исполняемые файлы powershell.exe и pwsh.exe в список исключения антивируса.
Если положительного результата достигнуть не удалось, переустановите компоненты .NET Framework.
Возможно, проблема вызывается повреждением их файлов.
Добавить комментарий