2013-12-24 4 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 также продолжает потреблять пару гигабайт оперативной памяти. После этой задержки использование ОЗУ возвращается к нормальной работе, IntelliSense работает, и все реагирует. Даже завершение переменной $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 

Вы можете положить, что внутри функции, но в моей системе, создавая перечисление занимает около 200 мс. Если вы собираетесь запустить это внутри цикла, я бы создал его в родительской области, поэтому функция не должна делать это каждый раз, когда она запускается.

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

$abc 
} 
+0

Wow ... Работает отлично! Большое спасибо mjolinor !!! – dharmatech

 Смежные вопросы

  • Нет связанных вопросов^_^