2010-05-12 24 views
2

我正在運行一些使用PowerShell V2的腳本,並且在控制檯窗口第一次加載時我注意到很長時間的停頓。我能做些什麼來改善腳本的性能?加速V2中的PowerShell腳本?

感謝,MagicAndi

回答

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} 

雖然你可以使用測量命令時,它並沒有顯示什麼是執行,你沒有命令輸出(只在一個非常詳細的時尚時間)。

那裏曾經是在早期的CTP一個問題,即安裝程序不會NGEN PowerShell的組件以及其他可能導致顯着的加載時間延遲。不過,我非常肯定,在最終的2.0安裝(以及Windows 7和Windows Server 2008 R2內置的PowerShell)中已經修復了這個問題。如果後續的目錄及其內容存在,您應該ngen'd:

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

Keith,被接受爲答案。抱歉耽擱了! – MagicAndi 2010-05-22 12:15:13

+0

有沒有辦法ngen模塊加載模塊?如PowerTab和PS社區擴展? – 2010-08-23 14:36:38

+0

是的,但手動。找到您加載的模塊所需的託管dll,並在其上運行ngen.exe。使用2.0框架中的ngen.exe 'C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v2.0.50727'。 – 2010-08-23 14:50:38

3

追查性能問題這樣可能會非常棘手,但也有一些事情可以做,以改善/解決的事情。

首先,啓動PowerShell冷與熱。至少在我的工作站上,第一次在早上運行PS時,啓動時間比後續時間要長。有沒有辦法讓它保持溫暖以最小化加載時間?

其次,使用像Process MonitorWindows Sysinternals工作的罰款鄉親的工具。將其設置爲監視powershell.exe進程,並查看它正在做什麼,這是很長的。對我而言,我有許多來自網絡的映射網絡驅動器和共享腳本。在我的測試中,我測量了每次啓動的每個遠程腳本在啓動時的延遲時間爲2秒。

PowerShell中確實需要從磁盤加載大量資源到內存中,所以應該不用說,有你的I/O系統達到最佳性能也將有所幫助。碎片整理,確保你有足夠的免費內存等,它甚至從註冊表中查詢一些,所以你可能想要確保你的registry is completely defragged - 雖然這是一個相當長的鏡頭。

+0

Goyuix,謝謝你指出要調查的各個領域。 +1 – MagicAndi 2010-05-15 00:15:54

0

它可能是完全不相關的,但我曾經在PowerShell啓動過程中有過一次大規模的停頓。

它在某種程度上涉及到的事實,我的筆記本電腦是在一個領域,我再休眠,並再次啓動它時,筆記本電腦,該域名是不是了。我用dottrace看了一下這個初創公司,只能看到在提供商的初始化過程中,代碼被卡住了。

在這種情況下重新啓動機器。也不總是發生(事實上,迄今爲止只有一次)。

0

使用內嵌C#加速X100最大

添加型-language CSharpVersion3 @ 「

」@

添加型@「

」 @

如果可以不使用-TypeDefinition @」

使用32位的powershell

加速×1.5

PS-run.cmd:

SET PS32 =%WINDIR%\ Syswow64資料\ WindowsPowerShell \ v1.0 \ powershell

%PS32%。\%*