【问题标题】:How do I create a custom array in powershell?如何在 powershell 中创建自定义数组?
【发布时间】:2015-11-06 20:34:05
【问题描述】:

我正在尝试在 PS 中整理数组。我试图解决的问题是返回一个复制的虚拟机列表和一些基本的统计数据。

阅读了大量网站和建议后,我能得到的最好的结果是以下脚本:

$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

这在我只有一个 VM 时有效,但当有多个 VM 时,输出显示在花括号内。

我想我终于走上了正确的道路。我只需要有人帮我解决剩下的难题。

另一个奇怪的事情是 New-TimeSpan 停止使用多个 VM。

提前致谢。

布雷登

【问题讨论】:

  • 我没看到你是怎么使用$vm变量的。
  • 您可以创建一个哈希表:$obj = @{key0='val'; key1=3.14} 并过滤管道:$array | select key0,key1 | ft -AutoSize

标签: powershell virtual-machine replication powershell-3.0 windows-server-2012-r2


【解决方案1】:

您的脚本最大的问题是:您启动了一个 foreach 循环,但您没有使用您正在循环的数组中的任何元素。您只需为数组中的每个项目循环遍历相同的数据。

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

我还建议使用 [PSCustomObject] 而不是 new-object / add-member :它更易于使用,代码更易于阅读,并且它还保持您使用它设置的属性的顺序(因为您'重新使用 get-vm 我假设你有 PS3 或更高版本)

【讨论】:

  • 在某些时候,我最终相信由 $vm 表示的单个 vm 正在“自动”传递给 Get-VMReplication 命令。不是这样。只需将 $vm 添加到该行即可完成所有 WAE。谢谢。
【解决方案2】:

我认为您可能会在每次 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

【讨论】:

  • 查看我的 awnser,了解他做错了什么:脚本循环通过一个集合,但集合中的任何元素实际上都没有在循环中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2019-11-16
  • 1970-01-01
  • 2023-03-26
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多