PowerShell-每条返回单行

时间:2018-10-25 13:44:12

标签: powershell foreach

我创建了一个脚本,用于为每个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在单个循环中只能接受一行,因此我需要以某种方式修改loop,以在输出中返回第一行,然后在第二次运行中返回第二行,依此类推。在

为了获得我尝试过的第一行(Normal VM1

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

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

3 个答案:

答案 0 :(得分:1)

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

尝试这种方式:

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

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

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

示例:

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

答案 1 :(得分:1)

花点时间看一下它是否超出所有输出到文件的大小,并一次性发送:

$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

答案 2 :(得分:0)

$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