2013-12-24 22 views
0

這是一個使用ValidateSet一個簡單的函數:ValidateSet用3001元將導致長時間的停頓

function TestLongValidateSet 
{ 
    param 
    (
     [ValidateSet(...)] 
     $abc 
    ) 

    $abc 
} 

我的版本有3001項,而不是...

如果你想在家裏自己跟隨,這裏是產生適合放置在那裏3001元列表的方式:

(0..3000 | foreach { (Get-Random -Count 30 (65..90 | ForEach-Object { [char]$_ })) -join '' } | ForEach-Object { "`"$_`"" }) -join ', ' | Out-File test.txt 

總之,上述功能加載到PowerShell中就好了。但是,首次嘗試使用IntelliSense會觸發多分鐘的延遲。 PowerShell ISE也會繼續消耗幾千兆字節的RAM。經過這段時間後,內存使用率回落到正常水平,智能感知工作,並且一切都很順暢。即使在$abc變量的完成是響應。

有沒有辦法避免漫長的初始延遲?

+0

您是否嘗試過在全局名稱空間中初始化該集合,然後在函數內指定它? –

回答

2

試試這個。它創建一個自定義枚舉類型,並使用替代ValidateSet

0..3000 | foreach { (Get-Random -Count 30 (65..90 | ForEach-Object { [char]$_ })) -join '' } | sv enumarray 

$i=0 
$enumlist = ($enumarray | foreach {'{0} = {1}' -f $_,$i++}) -join ', ' 

$enum = " 
namespace myspace 
{ 
public enum myenum 
{ 
$enumlist 
} 
} 
" 
Add-Type -TypeDefinition $enum -Language CSharpVersion3 

你可以把裏面的功能,但在我的系統,創建枚舉需要200ms左右。如果你打算在循環中運行它,我會在父範圍中創建它,所以函數不必在每次運行時都執行它。

function TestLongValidateSet 
{ 
param 
(
    [myspace.myenum]$abc 
) 

$abc 
} 
+0

哇...完美的作品!非常感謝mjolinor! – dharmatech

相關問題