【问题标题】:powershell.exe call from batch file unbearable slow after upgrading to windows 10升级到 Windows 10 后,批处理文件中的 powershell.exe 调用速度慢得无法忍受
【发布时间】:2018-11-06 09:28:04
【问题描述】:

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

调用如下所示:powershell -ExecutionPolicy Bypass -NonInteractive %scriptfile%

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

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

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

我创建了一个小助手脚本,可以从不同的起点测量 PowerShell 的启动性能:https://gist.github.com/mwallner/d3c86794bb74680b0c0cf4e9a9758ab4 这也不行,在 Win7 上,我的大多数 Win10 机器的启动时间都低于 1 秒。

这里有谁已经解决了这个谜题?

【问题讨论】:

  • 你试过-noprofile吗?该帐户是否有基于网络的“homedrive”?这个过程需要 10 秒与 100 毫秒有什么关系?
  • @AdamParsons 是的 -noprofile 在这种情况下不会改变任何事情+它在我的测试用例中(请参阅我包含的脚本)/这很重要,因为它不会被调用一次,但更像50 次 - 这部分不能轻易更改。
  • 您确定是 PowerShell 调用吗?我观察到任务序列步骤的执行时间明显长于执行时间,原因不明,不仅限于 PowerShell。
  • WinPE 启动映像的组件呢?与旧版本相比,它有什么特点(您使用的是较新的 WinPE 吗?)。

标签: windows powershell batch-file windows-10


【解决方案1】:

解决了! - 一直都是 UAC :-(

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

不知道为什么 UAC 会导致这些延迟,我敢肯定在某些情况下这不是一个选项 - 但对我来说,这是通过确保提升第一个脚本 + 为开发框禁用 UAC 来解决的。

【讨论】:

    【解决方案2】:

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

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

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

    ...所以它通过重新启动修复。 (我认为overriding the GPO-set value 也可以,但我没有尝试。)


    什么没用:

    我注意到简单地运行 PowerShell 相对较快,只有脚本执行(通过命令行参数或& / Call operator)比较慢。例如,我可以通过将脚本通过管道传输到 powershell 的标准输入来运行脚本,这不会导致减速:

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

    此时我尝试了troubleshooting with ProcMon,但没有显示任何长调用。

    接下来,我尝试打开进程资源管理器以在加载脚本时检查 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,它解释了我所看到的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2010-09-13
      • 2014-01-09
      • 2015-11-02
      • 1970-01-01
      • 2021-01-04
      相关资源
      最近更新 更多