Вызов powershell.exe из командного файла невыносимо медленный после обновления до Windows 10 - PullRequest
0 голосов
/ 27 мая 2018

У меня возникли проблемы с вызовом .bat -> .ps1 в процессе сборки после перехода с Win7 на Win10 (1607 LTSB) - вызов PowerShell, который занимал менее 100 мс на Win7, теперь занимает 10 с +на Win10 на некоторых хостах: - (

Звонок выглядит так: powershell -ExecutionPolicy Bypass -NonInteractive %scriptfile%

Производительность при запуске ISE и PowerShell.exe из меню «Пуск» хорошая.

До сих пор я не мог найти ничего полезного ...

  • PoSh 5.1 на Win7 и Win10, PSProfile чист, за исключением пары псевдонимов
  • $env: PATH является "чистым", за исключением пары папок, которые были добавлены специально - удаление тех не улучшило ситуацию.
  • уже сделал "обновление ngen" - проблема все еще возникает.

Я создал небольшой вспомогательный скрипт, который измеряет производительность запуска PowerShell с разных начальных точек: https://gist.github.com/mwallner/d3c86794bb74680b0c0cf4e9a9758ab4 с этим тоже не повезло, на Win7 и на большинстве моих машин с Win10 время запуска очень хорошее.ниже 1 сек.

кто-нибудь здесь, ктоуже разгадал эту загадку?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

У меня была похожая проблема - запуск сценариев занимал несколько секунд.

Проблема оказалась сочетанием двух факторов:

  • У меня было ExecutionPolicy force-установить RemoteSigned через GPO (запустить Get-ExecutionPolicy -List и проверить значение для MachinePolicy)
  • У меня было довольно много запущенных процессов, поэтому их перечисление занимало много времени

... так что это было исправлено перезагрузкой.(Я думаю, что переопределение значения, установленного для GPO также будет работать, но я не пробовал.)


Что не сработало:

Я заметил, что простой запуск PowerShell был относительно быстрым, только выполнение скрипта (через параметры командной строки или & / Оператор вызова ) был медленнымНапример, я мог запустить скрипт, отправив его по каналу powershell, что не повлекло за собой замедления:

type "script.ps1" | powershell.exe -noprofile -nologo -executionpolicy Bypass -file -

В этот момент я попытался устранить неполадки с ProcMon , но этого не произошлопоказать все длительные вызовы.

Далее я попытался открыть Process Explorer, чтобы проверить стек процесса powershell.exe во время загрузки сценария.Вершина стека была:

ntdll.dll!RtlGetNativeSystemInformation+0x14
KERNEL32.DLL!lstrcmpA+0x12d
KERNEL32.DLL!CreateToolhelp32Snapshot+0x108
[Native Frame: IL Method without Metadata]
[Managed to Unmanaged Transition]
System.Management.Automation.dll!System.Management.Automation.PsUtils.GetParentProcess+0x73
System.Management.Automation.dll!System.Management.Automation.Internal.SecuritySupport.GetExecutionPolicy+0x138

, что привело меня к выпуску # 2578 , который объяснил поведение, которое я видел.

0 голосов
/ 28 мая 2018

Решено!- это был UAC все время: - (

Решение: отключите UAC для пользователя, который запускает scriots, или убедитесь, что первый скрипт, который вызывает другие, запускается от имени администратора / повышенного уровня.

Не уверен, почему UAC вызывает эти задержки, и я уверен, что есть случаи, когда это не вариант, но для меня это решается путем обеспечения повышения уровня первого сценария + отключения UAC для блоков dev.

...