加速V2中的PowerShell脚本?

时间:2010-05-12 16:26:25

标签: performance powershell scripting powershell-v2.0

我正在使用PowerShell V2运行许多脚本,并且在控制台窗口首次加载时我注意到了很长的暂停。我该怎么做才能提高脚本的性能?

谢谢,MagicAndi

4 个答案:

答案 0 :(得分: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)。如果跟随dir及其内容存在,那么你应该知道:

dir 'C:\Windows\assembly\NativeImages_v2.0.50727_32\Microsoft.PowerShel#' -r

答案 1 :(得分:3)

跟踪这样的性能问题可能很棘手,但您可以采取一些措施来改进/修复问题。

首先,启动PowerShell冷和热。至少在我的工作站上,我第一次在早上运行PS,启动时间比后续时间长一些。有没有办法让你保持温暖,以减少加载时间?

其次,使用Process Monitor工作的优秀人员Windows Sysinternals之类的工具。将其设置为监视powershell.exe进程并查看它正在执行的操作需要很长时间。对我来说,我有许多映射的网络驱动器和共享脚本,它们来自网络。在我的测试中,我测量了每个正在加载的远程脚本启动时的两秒延迟。

PowerShell确实需要将一堆资源从磁盘加载到内存中,所以不用说让I / O系统以最佳状态运行也会有所帮助。碎片整理,确保你有足够的可用内存等等。它甚至从注册表中查询了很多,所以你可能想要确保你的registry is completely defragged - 虽然这是一个很长的镜头。

答案 2 :(得分:0)

这可能完全不相关,但我曾经在powershell启动期间遇到过大幅停顿。

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

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

答案 3 :(得分:0)

使用内联C#speedup x100 max

Add-Type -Language CSharpVersion3 @“

“@

Add-Type @“

“@

如果不能使用-TypeDefinition @“

使用32位PowerShell

加速x1,5

ps-run.cmd:

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

%PS32%。\%*