Медленный запуск Powershell в Windows 10

У меня проблема с медленным запуском PowerShell в Windows 10 (версия 1703 - Creators Update).

Мои технические характеристики (довольно быстрая машина): Intel i5-7440HQ (четырехъядерный) / 32 ГБ оперативной памяти DDR4 / 512 жестких дисков Samsung SSD.

Я пытался обойти профиль и политику выполнения, но это ничего не меняет:

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

6,228067

У моих друзей такой же ноутбук с Windows 10 без Creators Update запускается PowerShell менее чем за 0,5 сек.

Также попытался сделать компиляцию с ngen.exe, но это не помогло:

$env:path = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
[AppDomain]::CurrentDomain.GetAssemblies() | % {
  if (! $_.location) {continue}
  $Name = Split-Path $_.location -leaf
  Write-Host -ForegroundColor Yellow "NGENing : $Name"
  ngen install $_.location | % {"`t$_"}
}

Любая идея, как я могу исследовать эту проблему?

Привет

6 ответов

Это происходило со мной тоже - хотя, возможно, не лучший маршрут, добавив powershell.exe к списку исключений Защитника Windows увеличил его с 20 секунд до < 1 секунды.

Использование устаревшей консоли, очистка PSReadLine и запуск ngen, похоже, совсем не помогли.

У меня была такая же проблема в течение достаточно долгого времени, пока PowerShell не начал сбой при запуске со следующей ошибкой:

Exception:
System.OutOfMemoryException: Array dimensions exceeded supported range.
   at System.Collections.Generic.List`1.set_Capacity(Int32 value)
   at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)
   at System.Collections.Generic.List`1.Add(T item)
   at System.IO.File.InternalReadAllLines(String path, Encoding encoding)
   at Microsoft.PowerShell.PSConsoleReadLine.<ReadHistoryFile>b__67_0()
   at Microsoft.PowerShell.PSConsoleReadLine.WithHistoryFileMutexDo(Int32 timeout, Action action)
   at Microsoft.PowerShell.PSConsoleReadLine.DelayedOneTimeInitialize()
   at Microsoft.PowerShell.PSConsoleReadLine.Initialize(Runspace runspace, EngineIntrinsics engineIntrinsics)
   at Microsoft.PowerShell.PSConsoleReadLine.ReadLine(Runspace runspace, EngineIntrinsics engineIntrinsics)
-----------------------------------------------------------------------

Это привело меня к существующей проблеме Github: https://github.com/lzybkr/PSReadLine/issues/673

Я пытался удалить файл истории в ~\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ к тому времени было более 6 ГБ, и после этого консоль PowerShell начала открываться довольно быстро.

Возможно, медлительность, с которой вы сталкиваетесь, заключается в том, что PowerShell пытается прочитать большой файл истории (который еще недостаточно велик, чтобы вызвать OutOfMemory).

Вместо ngenзагружая каждый сборочный PowerShell, я стараюсь делать это каждый раз, когда запускаю обновление Windows 10 ngen update:

. (Join-Path ([Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()) ngen.exe) update

После обновления до мая 2019 года Win10 я вижу, что улучшена производительность

(measure-command { powershell.exe -command "1+1" }).TotalSeconds

от ~1,35 до ~0,55 с.

Что вы можете попробовать, так это создать ярлык для powershell.exe, щелкнуть его правой кнопкой мыши> Свойства, перейти на вкладку "Параметры" и нажать "Использовать устаревшую консоль". Моя программа чтения с экрана (magic и zoomtext) не смогла вынести "новую" консоль, которая пришла с осенним обновлением (Powershell был очень медленным). С legacy on все снова работает нормально.

После анализа powershell.exe с помощью procmon (инструмента sysinternals) я увидел, что процесс пытался что-то сделать в папке catroot2, поэтому после его переименования (вам необходимо остановить службу CryptSvc, которая блокирует папку), он был создан автоматически. Итак, вывод таков: папка повреждена. (Извините за мой плохой английский)

Выполнить следующий .bat

      net stop CryptSvc /y
rename c:\windows\system32\catroot2 Catroot2.bak
net start CryptSvc

Нашел это решение, когда погуглил и столкнулся с той же проблемой, но в 2022 году. К сожалению, это не решило мою проблему.

В наших системах есть требование безопасности групповой политики «Включить транскрипцию PowerShell». Политика требует, чтобы мы указали «каталог вывода стенограммы, чтобы он указывал на центральный сервер регистрации или другое безопасное место». Имя сервера изменилось, и никто не обновил политику. Как только я обновил объект групповой политики, указав новое местоположение, PowerShell мгновенно открылся снова.

Другие вопросы по тегам