PowerShell 中是否可能出现以下情况:"Select-Object <Property>.<SubProperty>"?
Is the following possible in PowerShell: "Select-Object <Property>.<SubProperty>"?
场景:我正在使用 Select-Object 访问管道对象的属性,其中一个属性本身就是一个对象。我们称它为 PropertyObject。我想访问那个 PropertyObject 的 属性,比如 Property1。是否有访问 Property1 的任何简洁明了的方法,如:
...| select-object PropertyObject.Property1
在试验过程中,我只有在执行以下操作后才能使其正常工作:
...| select-object {$_.PropertyObject.Property1}
如果我想用一个体面的列名来显示它,它会变得更加混乱:
...| select-object @{Name="Property1"; Expression={$_.PropertyObject.Property1}}
考虑到 PowerShell 通常是多么简洁明了,我不禁觉得我遗漏了一些东西,应该有一种更简洁的方法来访问 属性 或 属性。有吗?
编辑: 根据 Matt 的要求,这里是具体示例:
我正在读取一个 XML 文件,Books3.xml:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date inprint="false">2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
<publisher>
<name>Simon and Schuster</name>
<country>USA</country>
<city>New York</city>
</publisher>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date inprint="true">2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
<publisher>
<name>HarperCollins</name>
<country>USA</country>
<city>New York</city>
</publisher>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date inprint="false">2000-11-17</publish_date>
<description>After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.</description>
<publisher>
<name>Macmillan</name>
<country>United Kingdom</country>
<city>London</city>
</publisher>
</book>
</catalog>
将 XML 加载到 XmlDocument 中的代码:
$filePath = "C:\Temp\books3.xml"
$xmlDoc = new-object xml
$xmlDoc.load($filePath)
正在尝试阅读每本书的详细信息:
$xmlDoc.catalog.book | select author, title, publisher.name
结果:
author title publisher.name
------ ----- --------------
Gambardella, Matthew XML Developer's Guide
Ralls, Kim Midnight Rain
Corets, Eva Maeve Ascendant
如果你有一些实际可重复的东西供我们测试会更容易,但我们可以用 Get-Item
s return.
来伪造它
(Get-Item C:\temp\logoutput).Parent.Name
.Parent
实际上是一个 System.IO.DirectoryInfo
对象。我使用 PowerShell 3.0 点符号来获取 parent
的 name
通过链接 select
调用
可以获得相同的结果
Get-Item C:\temp\logoutput | select -expand Parent | Select -Expand name
这当然适用于 PowerShell 2.0,但不是简洁的 3.0 版本。
Post 问题编辑
不确定您希望得到什么。您所拥有的确实可以按照您拥有的方式提取子属性。我只能提供一种替代方法,它可能更直观、更友好,但结果是一样的。
$xml.catalog.book | ForEach-Object{
$_ | Add-Member NoteProperty "PublisherName" $_.publisher.name -PassThru}
当然,您可能仍需要使用 select
将输出限制为您需要的属性,但这是另一种选择。
您可以使用 calculated properties。一个简短的形式将允许这样做:
$xmlDoc.catalog.book | select author, title, {$_.publisher.name}
如果 属性 名称很重要,您需要添加它们。
$xmlDoc.catalog.book | select author, title, @{N="PublisherName";E={$_.publisher.name}}
其中 N 是名称的缩写,E 是表达式的缩写。
我也在寻找如何完成一个对象的子 属性 的 select。在我的例子中,它是为了导出 DNS 服务器的区域数据。我将分享我用来实现目标的胆量,这里的帖子很有帮助!
要执行您正在寻找的具体操作,请尝试按如下方式修改您的代码:
$xmlDoc.catalog.book | Select Author, Title, -Expand Publisher | Select Author, Title, Name | Sort Author | FT -auto
根据您提供的 table 输出,以上内容应该有效。它对我有用,您将在下面看到。
这个脚本非常适合我的需要,它融合了不同的想法。希望它适用于其他人。
$Zones = @(Get-DnsServerZone)
ForEach ($Zone in $Zones) {
Write-Host "`n$($Zone.ZoneName)" -ForegroundColor "Yellow"
$Data = New-Object System.Object
$Data = $Zone | Get-DnsServerResourceRecord
$Data | Add-Member -MemberType NoteProperty -Name "ZoneName" -Value $Zone.ZoneName
$Data += $Data
$Data | Select-Object ZoneName, HostName, RecordType -Expand RecordData | Select ZoneName, HostName, RecordType, IPv4Address, HostNameAlias, NameServer, PrimaryServer, ExpireLimit, MinimumTimeToLive, RefreshInterval, ResponsiblePerson, RetryDelay, SerialNumber, DomainName, Port, Priority, Weight | Sort RecordType, HostName | Export-Csv -NoTypeInformation "$($Zone.ZoneName).csv"
}
当您在导出之前查看输出时,黄色前景很方便。只需将 }
放在 HostName
之后和 | Export-Csv
之前,如下所示:... Sort RecordType, HostName }
场景:我正在使用 Select-Object 访问管道对象的属性,其中一个属性本身就是一个对象。我们称它为 PropertyObject。我想访问那个 PropertyObject 的 属性,比如 Property1。是否有访问 Property1 的任何简洁明了的方法,如:
...| select-object PropertyObject.Property1
在试验过程中,我只有在执行以下操作后才能使其正常工作:
...| select-object {$_.PropertyObject.Property1}
如果我想用一个体面的列名来显示它,它会变得更加混乱:
...| select-object @{Name="Property1"; Expression={$_.PropertyObject.Property1}}
考虑到 PowerShell 通常是多么简洁明了,我不禁觉得我遗漏了一些东西,应该有一种更简洁的方法来访问 属性 或 属性。有吗?
编辑: 根据 Matt 的要求,这里是具体示例:
我正在读取一个 XML 文件,Books3.xml:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date inprint="false">2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
<publisher>
<name>Simon and Schuster</name>
<country>USA</country>
<city>New York</city>
</publisher>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date inprint="true">2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
<publisher>
<name>HarperCollins</name>
<country>USA</country>
<city>New York</city>
</publisher>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date inprint="false">2000-11-17</publish_date>
<description>After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.</description>
<publisher>
<name>Macmillan</name>
<country>United Kingdom</country>
<city>London</city>
</publisher>
</book>
</catalog>
将 XML 加载到 XmlDocument 中的代码:
$filePath = "C:\Temp\books3.xml"
$xmlDoc = new-object xml
$xmlDoc.load($filePath)
正在尝试阅读每本书的详细信息:
$xmlDoc.catalog.book | select author, title, publisher.name
结果:
author title publisher.name
------ ----- --------------
Gambardella, Matthew XML Developer's Guide
Ralls, Kim Midnight Rain
Corets, Eva Maeve Ascendant
如果你有一些实际可重复的东西供我们测试会更容易,但我们可以用 Get-Item
s return.
(Get-Item C:\temp\logoutput).Parent.Name
.Parent
实际上是一个 System.IO.DirectoryInfo
对象。我使用 PowerShell 3.0 点符号来获取 parent
name
通过链接 select
调用
Get-Item C:\temp\logoutput | select -expand Parent | Select -Expand name
这当然适用于 PowerShell 2.0,但不是简洁的 3.0 版本。
Post 问题编辑
不确定您希望得到什么。您所拥有的确实可以按照您拥有的方式提取子属性。我只能提供一种替代方法,它可能更直观、更友好,但结果是一样的。
$xml.catalog.book | ForEach-Object{
$_ | Add-Member NoteProperty "PublisherName" $_.publisher.name -PassThru}
当然,您可能仍需要使用 select
将输出限制为您需要的属性,但这是另一种选择。
您可以使用 calculated properties。一个简短的形式将允许这样做:
$xmlDoc.catalog.book | select author, title, {$_.publisher.name}
如果 属性 名称很重要,您需要添加它们。
$xmlDoc.catalog.book | select author, title, @{N="PublisherName";E={$_.publisher.name}}
其中 N 是名称的缩写,E 是表达式的缩写。
我也在寻找如何完成一个对象的子 属性 的 select。在我的例子中,它是为了导出 DNS 服务器的区域数据。我将分享我用来实现目标的胆量,这里的帖子很有帮助!
要执行您正在寻找的具体操作,请尝试按如下方式修改您的代码:
$xmlDoc.catalog.book | Select Author, Title, -Expand Publisher | Select Author, Title, Name | Sort Author | FT -auto
根据您提供的 table 输出,以上内容应该有效。它对我有用,您将在下面看到。
这个脚本非常适合我的需要,它融合了不同的想法。希望它适用于其他人。
$Zones = @(Get-DnsServerZone)
ForEach ($Zone in $Zones) {
Write-Host "`n$($Zone.ZoneName)" -ForegroundColor "Yellow"
$Data = New-Object System.Object
$Data = $Zone | Get-DnsServerResourceRecord
$Data | Add-Member -MemberType NoteProperty -Name "ZoneName" -Value $Zone.ZoneName
$Data += $Data
$Data | Select-Object ZoneName, HostName, RecordType -Expand RecordData | Select ZoneName, HostName, RecordType, IPv4Address, HostNameAlias, NameServer, PrimaryServer, ExpireLimit, MinimumTimeToLive, RefreshInterval, ResponsiblePerson, RetryDelay, SerialNumber, DomainName, Port, Priority, Weight | Sort RecordType, HostName | Export-Csv -NoTypeInformation "$($Zone.ZoneName).csv"
}
当您在导出之前查看输出时,黄色前景很方便。只需将 }
放在 HostName
之后和 | Export-Csv
之前,如下所示:... Sort RecordType, HostName }