2

我正在使用 PowerShell V2 运行许多脚本,并且我注意到控制台窗口首次加载时会出现长时间的停顿。我可以做些什么来提高我的脚本的性能?

谢谢,魔术安迪

4

4 回答 4

7

除了最小化您在各种配置文件脚本中的内容(如下所示)之外,您无能为力:

C:\PS> $profile | fl * -force


AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : C:\Users\hillr\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\hillr\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

检查配置文件脚本是否导致滞后的一种方法是使用 -noprofile 选项启动 powershell。如果启动时间不同,那是因为您的配置文件脚本。您可以像这样使用 .NET 秒表:

function TimeThis([scriptblock]$scriptblock, $msg)
{
    if (!$stopWatch)
    {
        $script:stopWatch = new-object System.Diagnostics.StopWatch
    }
    $stopWatch.Reset()
    $stopWatch.Start()
    . $scriptblock
    $stopWatch.Stop()
    if ($msg -eq $null) { $msg = "$scriptblock" }
    "Execution time: $($stopWatch.ElapsedMilliseconds) mS for $msg"
}

. TimeThis {Import-Module $Module -args ~\Pscx.UserPreferences.ps1}

虽然您可以使用 Measure-Command,但它不会显示执行的内容,并且您不会得到任何命令输出(仅以非常冗长的方式显示时间)。

在早期的 CTP 中曾经存在一个问题,即安装程序不会生成 PowerShell 程序集,这可能会导致明显的加载时间延迟。但是,我很确定在最终的 2.0 安装中已经修复了这个问题(当然还有 Windows 7 和 Windows Server 2008 R2 中内置的 PowerShell)。如果以下目录及其内容存在,您应该是 ngen'd:

dir 'C:\Windows\assembly\NativeImages_v2.0.50727_32\Microsoft.PowerShel#' -r
于 2010-05-12T17:23:05.697 回答
3

跟踪这样的性能问题可能很棘手,但您可以做一些事情来改进/修复问题。

首先,冷启动 PowerShell 还是启动 PowerShell。至少在我的工作站上,我早上第一次运行 PS 时,启动时间比随后的时间要长一些。有没有办法让它保持温暖以最大限度地减少加载时间?

其次,使用为Windows Sysinternals工作的优秀人员提供的诸如Process Monitor之类的工具。将其设置为监视 powershell.exe 进程并查看它在做什么需要这么长时间。对我来说,我有许多从网络获取的映射网络驱动器和共享脚本。在我的测试中,我测量了我正在加载的每个远程脚本的启动延迟大约 2 秒。

PowerShell 确实需要将大量资源从磁盘加载到内存中,因此不用说让您的 I/O 系统发挥最佳性能也会有所帮助。碎片整理,确保您有足够的可用 RAM 等。它甚至会从注册表中查询相当多的内容,因此您可能希望确保您的注册表已完全碎片整理- 尽管这是一个很长的镜头。

于 2010-05-14T13:54:58.253 回答
0

它可能完全不相关,但我曾经在 powershell 启动期间有过巨大的停顿。

这与我的笔记本电脑在域中这一事实有关,然后当笔记本电脑不再在域中时,我将其休眠并再次启动它。我用 dottrace 查看了启动,只能看到在 Providers 初始化的某个地方代码卡住了。

在这种情况下,重新启动机器会有所帮助。而且它并不总是发生(事实上,到目前为止只有一次)。

于 2010-05-18T11:37:40.353 回答
0

使用内联 C# 加速 x100 max

Add-Type -Language CSharpVersion3 @"

“@

添加类型@"

“@

如果不能使用 -TypeDefinition @"

使用 32 位 powershell

加速 x1,5

ps-run.cmd:

SET PS32=%windir%\SysWOW64\WindowsPowerShell\v1.0\powershell

%PS32% .\%*

于 2012-12-30T19:21:18.810 回答