循环遍历自定义对象中的每个NoteProperty

时间:2014-12-24 21:05:45

标签: powershell

我在Powershell中创建PSObject,如下所示:

$NetworkInfo = New-Object PSObject
$NetworkInfo | Add-Member -type NoteProperty -Name IPAddress -Value "10.10.8.11"
$NetworkInfo | Add-Member -type NoteProperty -Name SubnetMask -Value "255.255.255.0"
$NetworkInfo | Add-Member -type NoteProperty -Name Gateway -Value "10.10.8.254"
$NetworkInfo | Add-Member -type NoteProperty -Name Network -Value "10.10.8.0"
$NetworkInfo | Add-Member -type NoteProperty -Name DNS1 -Value "10.10.10.200"
$NetworkInfo | Add-Member -type NoteProperty -Name DNS2 -Value "10.10.10.201"

$NetworkInfo

我想为这个PSObject中的每个NoteProperty做一个特定的操作,但是我不知道如何去做。例如(尽管我知道这是错误的方法)这段代码:

  ForEach ($noteProperty in $NetworkInfo) {
    Write-Host $noteProperty
  }

仅将整个对象输出为数组:

@{IPAddress=10.10.8.11; SubnetMask=255.255.255.0; Gateway=10.10.8.254; Network=10.10.8.0; DNS1=10.10.10.200; DNS2=10.10.10.201}

编辑:每个NoteProperty都是变量类型System.String - 如果这是相关的。

我是否错误地创建了对象,或者我只是不明白如何浏览对象?

4 个答案:

答案 0 :(得分:40)

您可以使用Mike提到的Get-Member;保持顺序的替代方法是使用所有对象上存在的PSObject属性:

#View details for all properties on a specific object
$NetworkInfo.PSObject.Properties

#similar code to Mike's, working with name and value:
$NetworkInfo.PSObject.Properties | foreach-object {
    $name = $_.Name 
    $value = $_.value
    "$name = $value"
}

答案 1 :(得分:14)

这可以满足您的需求:

$NetworkInfo | get-member -type NoteProperty | foreach-object {
  $name=$_.Name ; 
  $value=$NetworkInfo."$($_.Name)"
  write-host "$name = $value"
}

答案 2 :(得分:1)

尝试:

var types = require('pg').types
types.setTypeParser(<I DONT REMEMBER VAR NAME, NEED TO CHECK>, value => value === null ? null : +value)

答案 3 :(得分:1)

简短(甚至更快)版本:

$NetworkInfo.psobject.properties.foreach({"$($_.Name) = $($_.Value)"})

输出:

IPAddress = 10.10.8.11
SubnetMask = 255.255.255.0
Gateway = 10.10.8.254
Network = 10.10.8.0
DNS1 = 10.10.10.200
DNS2 = 10.10.10.201

或者另一个:

$NetworkInfo.foreach({$_})

会给你:

IPAddress  : 10.10.8.11
SubnetMask : 255.255.255.0
Gateway    : 10.10.8.254
Network    : 10.10.8.0
DNS1       : 10.10.10.200
DNS2       : 10.10.10.201

您还可以选择 1 个属性,例如:

$NetworkInfo.DNS1

哪个会给你:

10.10.10.200

或选择所有 DNS 条目:

$NetworkInfo.foreach({$_}) | Select-Object  DNS*

结果:

DNS1         DNS2
----         ----
10.10.10.200 10.10.10.201

或者如果您愿意:

$NetworkInfo.psobject.properties.where({$_.Name -like 'DNS*' }).Value

会给:

10.10.10.200
10.10.10.201

结合 foreach 和 where:

$NetworkInfo.psobject.properties.where({$_.Name -like 'DNS*' }).foreach({
"$($_.Name) = $($_.Value)"})

愿意付出:

DNS1 = 10.10.10.200
DNS2 = 10.10.10.201

将其转换为二维数组:

$NetworkInfo.psobject.properties.where({$_.Name -like 'DNS*' }).foreach({
,(@([string]$_.Name, [string]$_.Value))})

不要忘记“{,”中的“,” 输出:

DNS1
10.10.10.200
DNS2
10.10.10.201

哪个是二维的

$NetworkInfo.psobject.properties.where({$_.Name -like 'DNS*' }).foreach({
,(@([string]$_.Name, [string]$_.Value)) })[0]
DNS1
10.10.10.200

以及以下内容:

$NetworkInfo.psobject.properties.where({$_.Name -like 'DNS*' }).foreach({
,(@([string]$_.Name, [string]$_.Value)) })[0][0]
DNS1

还有……

$NetworkInfo.psobject.properties.where({$_.Name -like 'DNS*' }).foreach({
,(@([string]$_.Name, [string]$_.Value)) })[0][1]
10.10.10.200