PowerShell/PowerCLI 对上一个对象的引用
PowerShell/PowerCLI reference to previous object
我正在开发简单的单行报告,但无法正常工作。
我正在通过 cmdlet Get-VMHost
检索 ESXi 主机。 Get-VMHost
通过管道传输到 Get-VMHostSysLogServer
。
作为输出,我得到 Host
和 Port
属性。我想显示以下属性:
- 姓名(来自
Get-VMHost
)
- 主机和端口(均来自
Get-VMHostSysLogServer
)。
我怎样才能做到这一点?
这是一种解决方案,可以构建具有所需属性的自定义对象:
Get-VMHost | ForEach-Object {
$SysLog = $_ | Get-VMHostSysLogServer
ForEach ($SysLogServer in $SysLog) {
$Result = @{
VMHost = $_.name
SysLogHost = $SysLogServer.Host
Port = $SysLogServer.Port
}
New-Object -TypeName PSObject -Property $Result
}
}
解释:
- 使用 ForEach-Object 循环遍历
Get-VMHost
返回的每个 VM 主机(通过 $_
表示为当前管道项)。
- 获取每个Host的SysLogServers到
$SysLog
- 遍历所有 SysLogServer,构建所需属性的哈希表
@{ }
。
- 使用
New-Object
输出一个对象,使用哈希表中的属性返回到管道。
如果您想将结果捕获到变量中,只需在 Get-VMHost
之前添加 $YouVar =
。
如果您想将结果发送到另一个接受管道输入的 cmdlet(例如 Export-CSV),您可以直接将其作为结尾,只需在最后一个关闭 [=19] 之后附加 | Export-CSV Your.csv
=].这是使用ForEach-Object
作为外循环的好处,它支持管道。
我正在开发简单的单行报告,但无法正常工作。
我正在通过 cmdlet Get-VMHost
检索 ESXi 主机。 Get-VMHost
通过管道传输到 Get-VMHostSysLogServer
。
作为输出,我得到 Host
和 Port
属性。我想显示以下属性:
- 姓名(来自
Get-VMHost
) - 主机和端口(均来自
Get-VMHostSysLogServer
)。
我怎样才能做到这一点?
这是一种解决方案,可以构建具有所需属性的自定义对象:
Get-VMHost | ForEach-Object {
$SysLog = $_ | Get-VMHostSysLogServer
ForEach ($SysLogServer in $SysLog) {
$Result = @{
VMHost = $_.name
SysLogHost = $SysLogServer.Host
Port = $SysLogServer.Port
}
New-Object -TypeName PSObject -Property $Result
}
}
解释:
- 使用 ForEach-Object 循环遍历
Get-VMHost
返回的每个 VM 主机(通过$_
表示为当前管道项)。 - 获取每个Host的SysLogServers到
$SysLog
- 遍历所有 SysLogServer,构建所需属性的哈希表
@{ }
。 - 使用
New-Object
输出一个对象,使用哈希表中的属性返回到管道。
如果您想将结果捕获到变量中,只需在 Get-VMHost
之前添加 $YouVar =
。
如果您想将结果发送到另一个接受管道输入的 cmdlet(例如 Export-CSV),您可以直接将其作为结尾,只需在最后一个关闭 [=19] 之后附加 | Export-CSV Your.csv
=].这是使用ForEach-Object
作为外循环的好处,它支持管道。