2015-11-17 9 views
0

Можем ли мы отложить инициализацию переменных до тех пор, пока это не понадобится?Lazy loading в powershell?

Что я хотел бы сделать, это предопределить некоторые переменные в моем профиле, который будет содержать список AD компьютера:

скажем, я хочу:

$ OU1_workstation будет заполняться компьютеры, найденные в OU = рабочих станций, OU = OU1, dc = домен, DC = COM

$ OU2_workstation заправить компьютеров, найденных в
OU = рабочие станции, OU = OU2, dc = domain, dc = com и т. Д.

Для этого я использую следующий скрипт, но для вычисления требуется 30 секунд, поэтому в настоящее время я не могу его вставить мой профиль ...

Get-ADOrganizationalUnit -SearchScope onelevel -Filter "*" -Properties "name","distinguishedname" |%{ 
    set-Variable -Name "$($_.name)_workstation" -value (Get-ADComputer -Searchbase "OU=workstations,$($_.Distinguishedname)" -Filter *) 
}  

Какие варианты доступны в PowerShell?

+2

'$ Ленивый = [Ленивый [PSObject]]: : new ([Func [PSObject]] {dir}) ' – PetSerAl

+0

lol Я думаю, что OP хочет оптимизировать свою команду, чтобы сделать это быстрее – sodawillow

+1

@sodawillow это не про оптимизацию, я думаю, что это близко к тому, что я хочу: http://stackoverflow.com/a/14503339/381149 –

ответ

0

Наконец, на основе @Richard's reply предыдущего вопроса, я выбрал следующий путь для достижения какой-то ленивой загрузки: используя scriptpropertyPSCustomObject. Так что я могу поставить это в моем профиле

#requires -module activedirectory 
$server=New-Object PSCustomObject 
Get-ADOrganizationalUnit -SearchScope onelevel -Filter "*" -Properties "name","distinguishedname" | 
?{ 
    $_.name -notmatch 'Administrateurs|Administration|Comptes de deploiement|Contacts|Domain Controllers|Groupes|Serveurs|Services' 
} | 
%{ 
    $OU=$_.name 
    $s=[scriptblock]::Create("Get-ADComputer -SearchBase ""OU=servers,OU=$OU,DC=domain,DC=com"" -Filter 'name -notlike "" *old""' |select -expand name") 
    $server| Add-Member -MemberType ScriptProperty -name $OU -value $s -Force 
} 

тогда, когда это необходимо, я могу назвать $server.OU1, чтобы получить все сервера под этим OU, $server.OU2 и т.д. ...

+0

ИМХО, это не совсем ленивая загрузка. Он оценивает команду «Get-ADComputer ...» каждый раз, когда вы ее запрашиваете. Для вызова функции просто используется другой синтаксис. – PetSerAl

+0

Вы правы, поэтому я сказал своего рода ленивую загрузку. Но это хорошо для моих повседневных потребностей :) и позволяет определять вещи, не выполняя их. Чтобы избежать выполнения кода каждый раз, когда я могу создать еще один var: '$ OU1_server = $ server.OU1' ... –

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

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