【问题标题】:PowerShell-for each return single linePowerShell-为每个返回单行
【发布时间】:2018-10-25 13:44:12
【问题描述】:

我创建了一个脚本,用于返回每个 AzureVM 的 Azure 保管库复制状态

 $items = Get-AzureRmRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $Containers
    foreach ($item in $items)
  {
   $a=$item.ReplicationHealth,$item.RecoveryAzureVMName
   write-host $a  
}

得到想要的输出:

Normal VM1
Normal VM2
Critical VM3
Normal VM4
Critical VM5

我需要将上面的输出传递给 zabbix。不幸的是,zabbix 在单个循环中只能接受一行,所以我需要以某种方式修改 for 循环,以在输出中返回第一行,然后在第二次运行时返回第二行等等开

为了得到第一行 (Normal VM1) 我试过了

foreach ($item in $items)
{
write-host $item.ReplicationHealth,$item.RecoveryAzureVMName | select -First 1
}

但是我在输出中得到了所有五行,是否可以将输出放入数组,然后从中返回特定的行?

【问题讨论】:

  • 监控每个 VM 并使用单个项目按名称/ID 检查它们比获取所有输出并解析它更有意义(恕我直言,这更复杂且浪费时间)跨度>
  • 刚刚发布了新答案(将结果导出到文件并一次性推送)

标签: powershell foreach


【解决方案1】:

通过这种方式传递项目,您将枚举它们而不是连接结果。

试试这个方法:

foreach ($item in $items)
{
    $a = '{0} {1}' -f $item.ReplicationHealth,$item.RecoveryAzureVMName
    Write-Host $a  
}

使用-f 运算符以格式字符串开头,后跟一个或多个对象或表达式,这些对象或表达式将转换为字符串并插入到格式字符串的指定位置。

格式字符串中的{0}是一个格式项。 0 是将在该位置插入其字符串值的对象的索引。 (索引从 0 开始。)如果要插入的对象不是字符串,则调用其 ToString 方法将其转换为 1,然后再将其插入结果字符串。

例子:

'{0} is an {1}' -f 'This','example'
This is an example

【讨论】:

  • 谢谢,但它不起作用:我需要得到,第一行Normal VM1,然后,在第二个forloop运行中得到Normal VM2等等......
  • @xerks,循环会以这种方式一个一个地发送项目。只是你把所有的线放在一起来控制台,尽管它们仍然分开。尝试将 Write-Host 更改为 Write-Output 并在每个循环中将输出传递给 foreach 内的 zabbix。
  • @xerks,我不熟悉Get-AzureRmRecoveryServicesAsrReplicationProtectedItem 输出,$item 对象是什么样的?这也是一组对象吗?
  • 我喜欢你使用-f,我一直忘记它。
【解决方案2】:

我花了一段时间才弄清楚——将所有输出踢到文件中并一次性发送:

$filename = "C:\trapper.imports";
write-host $filename;

foreach ($item in $items)
{
'"{0}" {1}' -f "VM01",'replication['+$item.RecoveryAzureVMName+']',""""+$item.ReplicationHealth+"""" | Add-Content -LiteralPath $filename -Encoding "Default" -Force;

}

cd "C:\Program Files\Zabbix Agent\bin\win64"

.\zabbix_sender.exe -z zabbix_host -p 10051 -c "C:\Program Files\Zabbix Agent\conf\zabbix_agentd.win.conf" -i $filename -vv

【讨论】:

    【解决方案3】:
    $items = Get-AzureRmRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $Containers
    $items | foreach { "$($_.ReplicationHealth) $($_.RecoveryAzureVMName)" }
    

    这将返回:

    Normal VM1
    Normal VM2
    Critical VM3
    Normal VM4
    Critical VM5
    

    如果你只想要第一行,你可以把它输入select

    $items | foreach { "$($_.ReplicationHealth) $($_.RecoveryAzureVMName)" } | select -First 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2014-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多