Powershell在一个Select-Object中获取不同级别的节点值

Powershell getting node values of different levels in one Select-Object

有没有办法做一个Select-Object并获取不同级别节点的值?

我需要字段级别的名称和一堆字段,还需要 globalFormat 类别类型。 有没有办法将它们合二为一 Select-Object?

XML

<field name="FLD0000001" tableAlias="*SERVER" tableName="*SERVER">
  <order>0</order>
  <version></version>
  <afterEditEvent></afterEditEvent>
  <format></format>
  <globalFormat categoryType="Number" countrySymbolCode="" dateFormat="" timeFormat="" imageFormat="None" decimalPlaces="2" leadingZero="0" isCentury="false" negativeFormat="NegativeSymbol" />
  <columnGroupHeading></columnGroupHeading>
  <dataFieldType>20</dataFieldType>
  <columnHeading><![CDATA[FLD0000001]]></columnHeading>
  <hideHeader>False</hideHeader>
  <groupable>0</groupable>
  <subTotal>0</subTotal>
  <calculation></calculation>
  <jScriptCalculation />
  <editCalculation scriptContent="" scriptDisplayContent="">
    <tokens />
    <triggers />
  </editCalculation>
  <onCalculationEvent></onCalculationEvent>
  <onValidationEvent></onValidationEvent>
  <editableAdvanced></editableAdvanced>
  <addRequired>0</addRequired>
  <splitByRationOn></splitByRationOn>
  <defaultValue></defaultValue>
  <isCalculatable>0</isCalculatable>
  <isUpdatable>0</isUpdatable>
  <visibleAdvanced></visibleAdvanced>
  <editableLevel>0</editableLevel>
  <visibleLevel>10</visibleLevel>
  <fullTypeName></fullTypeName>
  <dataType>NUMERIC</dataType>
  <dataLength>5</dataLength>
  <description source="" format="4"></description>
  <dimensionTitle></dimensionTitle>
  <definition></definition>
  <parameterName></parameterName>
  <cubeDimensionOrder>0</cubeDimensionOrder>
  <subTotalRestrictions></subTotalRestrictions>
  <subTotalExceptions></subTotalExceptions>
  <matrixHeaderValue></matrixHeaderValue>
  <promptRestricted>0</promptRestricted>
  <prompt processId="" />
  <promptOption></promptOption>
  <sortOrderForPrompt>NONE</sortOrderForPrompt>
  <filterForPrompt></filterForPrompt>
  <relatedFields></relatedFields>
  <validateAgainstPrompt>False</validateAgainstPrompt>
  <subGroupId></subGroupId>
  <indexInGroup>0</indexInGroup>
  <widthInFieldArea>2000</widthInFieldArea>
</field>

我基本上想检查 dataFieldType,如果它是 20 或 21,请检查 globalFormat categoryType 以查看它是否是 none,如果是,则作为未正确设置的 Field 输出到文件中。但我在 xml

中有数百个字段

您可以将 Select-XmlXPath 查询和 Select-Object 结合使用,以获得您需要的元素和属性值。您可以指定不同的 XPaths 以达到不同的节点级别,包括元素属性,我相信。

请参阅 Microsoft docs 中的这些示例:

$Path = "$Pshome\Types.ps1xml"
$XPath = "/Types/Type/Members/AliasProperty"
Select-Xml -Path $Path -XPath $Xpath | Select-Object -ExpandProperty Node
Name                 ReferencedMemberName
----                 --------------------
Count                Length
Name                 Key
Name                 ServiceName
RequiredServices     ServicesDependedOn
ProcessName          Name
Handles              Handlecount
VM                   VirtualSize
WS                   WorkingSetSize
Name                 ProcessName
Handles              Handlecount
VM                   VirtualMemorySize
WS                   WorkingSet
PM                   PagedMemorySize
NPM                  NonpagedSystemMemorySize
Name                 __Class
Namespace            ModuleName

例如,如果您想获取 globalFormat 元素的属性,您可以这样做:

$path = "\test.xml"
$xpath = "/field/globalFormat"
Select-Xml -Path $path -XPath $xpath | Select-Object -ExpandProperty Node

categoryType      : Number
countrySymbolCode :
dateFormat        :
timeFormat        :
imageFormat       : None
decimalPlaces     : 2
leadingZero       : 0
isCentury         : false
negativeFormat    : NegativeSymbol

如果你想同时访问不同的元素和属性,你可以这样做:

$path = "test.xml"
$xpathField = "/field"
$xpathGlobalFormat = "/field/globalFormat"
$field = Select-Xml -Path $path -XPath $xpathField | Select-Object -ExpandProperty Node
$globalFormat = Select-Xml -Path $path -XPath $xpathGlobalFormat | Select-Object -ExpandProperty Node
$field.tableName # this returns *SERVER
$globalFormat.categoryType # this returns Number

要在 的基础上进行构建,我想您正在寻找一个 XPath 查询,您可以利用它一次性获取信息。我在想:

(Select-Xml -Xml $Xml -XPath "/field/@* | /field/globalFormat/@categoryType").Node

我不确定您要查找的输出是什么,但另一种选择是简单地 select 字段节点并只使用“。”引用以获取子属性以构造自定义对象。

获取/field AND /field/globalFormat下的所有元素和属性:

(Select-Xml -Xml $Xml -XPath '/field | /field/globalFormat').Node