2016-11-18 3 views
-2

Нижеприведенные скрипты работают, но для завершения задания требуется много времени. Может ли кто-нибудь помочь мне преобразовать этот скрипт быстрее.PowerShell с использованием hashtable

$servers = Get-Content Servers.txt 
$TCount = $servers.Count 
$count = 1 
foreach ($server in $servers) { 
    Write-Host "$Count/$Tcount - $Server" -NoNewline 

    $Result = Get-VM -Name $server | Set-Annotation -CustomAttribute "SNAP" -Value "True" 

    if ($Result.Value -eq "true") { 
     Write-Host "`t - Success" -fore "green" 
    } else { 
     Write-Host "`t - Failed" -fore "Red" 
    } 

    $count = $Count +1 
} 
+1

Почему, по вашему мнению, хэш-таблица была бы релевантной? – vonPryz

+0

Не уверен, только что получил некоторые документы, говорит, что хеш-таблица работает лучше. – rpr

+1

Довольно уверен, что хэш-таблица не ускорит что-либо. Задержка здесь, вероятно, будет связана с временем, которое требуется, чтобы Get-VM извлекала список виртуальных машин с удаленных серверов. – Asnivor

ответ

0

Как можно что-то вроде Get-HardDisk -VM "myVM" работать на всех? В конце концов, «myVM» - это строка, а не VirtualMachine, так что это не должно произойти?

Причина этого в том, что VI Toolkit использует функцию PowerShell, которая позволяет преобразовывать аргументы, которые вы получаете в командной строке. Это основа того, что мы называем «Object By Name» на VI Toolkit: если вы укажете строку, где должен быть объект, VI Toolkit работает за кулисами, чтобы заменить эту строку объектом, который представляет строка.

Неизбежно этот поиск имеет стоимость, вопрос в том, сколько это стоит? Это приводит нас к довольно неудачному свойству VI Toolkit, который заключается в том, что когда вы получаете виртуальную машину, вся фильтрация выполняется на стороне клиента. С одной стороны это хорошо, потому что это позволяет нам поддерживать подстановочные знаки и нечувствительность к регистру. Однако есть одно очень неудачное последствие, которое заключается в том, что для загрузки одной виртуальной машины требуется столько же времени, сколько требуется, чтобы загрузить все из них (подробнее о том, как мы улучшаем это ниже). Это основная причина того, что второй пример является настолько медленным: каждый раз, когда вызывается Get-HardDisk, VI Toolkit просматривает один машинный объект за кулисами.

http://blogs.vmware.com/PowerCLI/2009/03/why-is-my-code-so-slow.html

попробовать:

$servers = Get-Content Servers.txt 
$VMs = Get-VM | Where-Object {$_.Name -in $servers} 

$TCount = $servers.Count 
$count = 1 
foreach ($vm in $VMs) 
{ 
    Write-Host "$Count/$Tcount - $Server" -NoNewline 

    $Result = $vm | Set-Annotation -CustomAttribute "SNAP" -Value "True" 

    if ($Result.Value -eq "true") { 
     Write-Host "`t - Success" -fore "green" 
    } else { 
     Write-Host "`t - Failed" -fore "Red" 
    } 

    $count = $Count +1 
} 

для загрузки виртуальных машин один раз, а затем цикл по $ виртуальных машин, чтобы добавить аннотацию.

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