在从Win7移动到Win10(1607 LTSB)之后,我在构建过程中遇到.bat
- > .ps1
调用时出现问题 - 对PowerShell的调用,耗时不到100毫秒在某些主机上,Win7现在在Win10上需要10秒+: - (
通话如下:powershell -ExecutionPolicy Bypass -NonInteractive %scriptfile%
从开始菜单启动ISE和PowerShell.exe的性能很好。
到目前为止,我无法挖掘任何有用的东西......
我创建了一个小帮助程序脚本,从不同的起点测量PowerShell的启动性能:https://gist.github.com/mwallner/d3c86794bb74680b0c0cf4e9a9758ab4运气不好,在Win7和我的大多数Win10机器启动时间都低于1秒。
这里有谁已经解开了这个谜语?
答案 0 :(得分:4)
解决! - 它一直是UAC: - (
解决方案:为正在运行scriots的用户禁用UAC,或确保调用其他脚本的第一个脚本以管理员/提升方式运行。
不确定为什么UAC会导致这些延迟,并且我确定有些情况下这不是一个选项 - 但对我来说,这可以通过确保第一个脚本被提升+禁用UAC for dev box来解决。 / p>
答案 1 :(得分:2)
我遇到了类似的问题-脚本需要花费几秒钟才能启动。
问题原来是两个因素的结合:
ExecutionPolicy
强制设置为RemoteSigned
(运行Get-ExecutionPolicy -List
并检查MachinePolicy
的值)...因此已通过重新启动进行修复。 (我认为overriding the GPO-set value也可以,但是我没有尝试过。)
什么不起作用:
powershell -NoProfile
)$PSModuleAutoloadingPreference = 'none'
,即powershell.exe -NoProfile -ExecutionPolicy Bypass -command "$PSModuleAutoloadingPreference = 'none'; & path\to\script.ps1"
我注意到,简单地运行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,该行为解释了我所看到的行为。