2

我想在PS中理清数组。我试图解决的问题是返回一个复制的虚拟机列表和一些基本的统计数据。如何在PowerShell中创建自定义数组?

已经通过网站和建议的大量阅读,我能得到的最好的是下面的脚本:

$myArray = @() 

$vms = get-vm | where-object { $_.replicationstate -ne "Disabled" } 

foreach ($vm in $vms) 
{ 
    $vmRepl = Get-VMReplication 

    $replfreq = (New-TimeSpan -seconds $vmRepl.replicationfrequencysec) 
    $lastrepl = $vmRepl.lastreplicationtime 
    $nextrepl = $lastrepl + $replfreq 
    $secfrom = [math]::Round((New-TimeSpan -start  $vmRepl.lastreplicationtime).TotalSeconds) 
    $secto = [math]::Round((New-TimeSpan -end ($vmRepl.lastreplicationtime + $replfreq)).TotalSeconds) 

    $obj = New-Object System.Object 
    $obj | Add-Member -MemberType NoteProperty -Name Name -Value $vmRepl.Name 
    $obj | Add-Member -MemberType NoteProperty -Name ReplicationFrequencySec -Value $vmRepl.replicationfrequencysec 
    $obj | Add-Member -MemberType NoteProperty -Name SecondsSinceLastRepl -Value $secfrom 
    $obj | Add-Member -MemberType NoteProperty -Name SecondsUntilNextRepl -Value $secto 
    $obj | Add-Member -MemberType NoteProperty -Name LastReplication -Value $lastrepl 
    $obj | Add-Member -MemberType NoteProperty -Name NextReplication -Value $nextrepl 

    $myArray += $obj 

} 

write-output $myArray | ft -AutoSize 

这工作时,我只有一个虚拟机,但是当有多个的出现卷曲内输出括号。

我想我终于在正确的轨道上。我只需要有人帮助我理清拼图的其余部分。

另一个奇怪的是,New-TimeSpan停止与多个虚拟机一起工作。

在此先感谢。

布拉登

+1

我看不出你是如何使用'$ vm'变量的。 – PetSerAl

+1

你可以创建一个哈希表:'$ obj = @ {key0 ='val'; key1 = 3.14}'并且过滤管道:'$ array |选择key0,key1 | ft -AutoSize' – mtman

回答

0

与脚本最大probem是:你开始一个foreach循环,但你不使用从你循环遍历数组的元素。您只需循环访问数组中每个项目的相同数据。

基本上,当前脚本会检索VM列表,然后为每个条目获取阵列中所有机器的复制状态。然后你对这个集合做一些处理,然后把这个集合添加到一个新对象中(这对你列表中的每个条目都是一样的)。有关的foreach的使用一个很好的解释看 http://blogs.technet.com/b/heyscriptingguy/archive/2014/04/28/basics-of-powershell-looping-foreach.aspx

我也建议使用[PSCustomObject]而不是新的对象/添加成员:它更容易使用,代码更易于阅读,它也保持你设置的属性顺序(因为你使用get-vm我假设你有PS3或更高版本)

+0

在某些时候,我终于相信由$ vm表示的单个vm被“自动”传递给Get-VMReplication命令。并非如此。只需将$ vm添加到该行,就可以使WAE成为一切。谢谢。 –

0

我想你可能会覆盖在每个迭代foreach()同一对象($obj)。

试试这个:

$VMs = Get-Vm | Where-Object {$_.ReplicationState -ne 'Disabled'} 
$MyVmReplicationStatus = foreach ($VM in $VMs){ 
    $VMReplStatus = Get-VMReplication 
    $LastRepTime = $VMReplStatus.LastReplicationTime 
    $ReplFreqSecs = $VMReplStatus.ReplicationFrequencySec 
    $ReplFrequency = (New-TimeSpan -Seconds $ReplFreqSecs) 

    $Props = @{ 
    Name     = $VMReplStatus.Name 
    ReplicationFrequencySec = $ReplFreqSecs 
    SecondsSinceLastRepl = [System.Math]::Round((New-TimeSpan -Start $LastRepTime).TotalSeconds) 
    SecondsUntilNextRepl = [System.Math]::Round((New-TimeSpan -End ($LastRepTime + $ReplFrequency)).TotalSeconds) 
    LastReplication   = $LastRepTime 
    NextReplication   = $LastRepTime + $ReplFrequency 
    } 

    New-Object -TypeName psobject -Property $Props 
} 

Write-Output -InputObject $MyVmReplicationStatus | Format-Table -AutoSize 
+0

查看我的awnser,了解他在做什么错误:脚本循环访问集合,但集合中没有任何元素实际上正在循环中使用。 – bluuf

相关问题