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-Xml
与 XPath
查询和 Select-Object
结合使用,以获得您需要的元素和属性值。您可以指定不同的 XPath
s 以达到不同的节点级别,包括元素属性,我相信。
请参阅 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
有没有办法做一个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-Xml
与 XPath
查询和 Select-Object
结合使用,以获得您需要的元素和属性值。您可以指定不同的 XPath
s 以达到不同的节点级别,包括元素属性,我相信。
请参阅 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
要在
(Select-Xml -Xml $Xml -XPath "/field/@* | /field/globalFormat/@categoryType").Node
我不确定您要查找的输出是什么,但另一种选择是简单地 select 字段节点并只使用“。”引用以获取子属性以构造自定义对象。
获取/field
AND /field/globalFormat
下的所有元素和属性:
(Select-Xml -Xml $Xml -XPath '/field | /field/globalFormat').Node