使用哈希表的PowerShell
问题描述:
以下脚本可以使用,但完成作业需要很长时间。有人可以帮助我将这个脚本转换为更快的方式。使用哈希表的PowerShell
$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
}
答
这怎么可能像GET-硬盘来-VM “myVM” 在所有的工作?毕竟,“myVM”是一个字符串,而不是一个VirtualMachine,所以不应该失败吗?
这样做的原因是因为VI Toolkit利用了PowerShell的一项功能,可以让您在命令行上转换您收到的参数。这就是我们称之为VI Toolkit的“Object By Name”功能的基础:如果您指定了一个对象应该在的字符串,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
}
加载虚拟机一次,然后循环在$虚拟机添加注释。
为什么你认为散列表是相关的? – vonPryz
不确定,只是得到了一些文件说,散列表执行得更好。 – rpr
很确定散列表不会加快速度。这里的延迟很可能与Get-VM从远程服务器检索虚拟机列表所花费的时间有关。 – Asnivor