升级到Windows 10后,批处理文件中的powershell.exe调用无法忍受

时间:2018-05-27 18:36:24

标签: windows powershell batch-file windows-10

在从Win7移动到Win10(1607 LTSB)之后,我在构建过程中遇到.bat - > .ps1调用时出现问题 - 对PowerShell的调用,耗时不到100毫秒在某些主机上,Win7现在在Win10上需要10秒+: - (

通话如下:powershell -ExecutionPolicy Bypass -NonInteractive %scriptfile%

从开始菜单启动ISE和PowerShell.exe的性能很好。

到目前为止,我无法挖掘任何有用的东西......

  • Win7和Win10上的PoSh 5.1,PSProfile除了几个别名外还很干净
  • $ env:除了故意添加的几个文件夹之外,PATH是“干净的” - 删除那些没有改善情况的文件夹。
  • 已经“ngen update” - 问题仍然存在。

我创建了一个小帮助程序脚本,从不同的起点测量PowerShell的启动性能:https://gist.github.com/mwallner/d3c86794bb74680b0c0cf4e9a9758ab4运气不好,在Win7和我的大多数Win10机器启动时间都低于1秒。

这里有谁已经解开了这个谜语?

2 个答案:

答案 0 :(得分:4)

解决! - 它一直是UAC: - (

解决方案:为正在运行scriots的用户禁用UAC,或确保调用其他脚本的第一个脚本以管理员/提升方式运行。

不确定为什么UAC会导致这些延迟,并且我确定有些情况下这不是一个选项 - 但对我来说,这可以通过确保第一个脚本被提升+禁用UAC for dev box来解决。 / p>

答案 1 :(得分:2)

我遇到了类似的问题-脚本需要花费几秒钟才能启动。

问题原来是两个因素的结合:

  • 我已通过GPO将ExecutionPolicy强制设置为RemoteSigned(运行Get-ExecutionPolicy -List并检查MachinePolicy的值)
  • 我正在运行许多进程,因此枚举它们会花费很长时间

...因此已通过重新启动进行修复。 (我认为overriding the GPO-set value也可以,但是我没有尝试过。)


什么不起作用:

我注意到,简单地运行PowerShell相对较快,只有脚本执行(通过命令行参数或& / Call operator)执行缓慢。例如,我可以通过将脚本通过管道传递到powershell的stdin来运行该脚本,而不会引起速度下降:

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

在这一点上,我尝试了troubleshooting with 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

这导致我进入issue #2578,该行为解释了我所看到的行为。