<department>
<employee name="ABC">
<salary value="basic">5000</salary>
<salary value="allowance">8000</salary>
</employee>
<employee name="XYZ">
<salary value="basic">6000</salary>
<salary value="allowance">3000</salary>
</employee>
</department>
在Powershell中如何获得津贴额大于基本津贴的雇员姓名。
我在下面尝试过,但没有给出结果
$result= $xml |Select-Xml '//department'|
ForEach{
$basic=$_.Node.employee.salary.value | where {$_.Node.employee.salary.value -eq 'basic'}
$allowance=$_.Node.employee.salary.value | where {$_.Node.employee.salary.value -eq 'allowance'}
if ($allowance -ge $basic)
{
$name=$_.Node.employee.name
}
}
echo $result
答案 0 :(得分:4)
如果要使用Select-Xml
,则可以执行以下操作:
$node = $xml | Select-Xml -XPath "//department/employee[./salary[@value='basic'] < ./salary[@value='allowance']]"
$node.node.name # Output the employee name
有关xpath表达式示例,请参见XPath Examples。有关XPath运算符的更多信息,包括<
和>
的转义,请参见Boolean, Comparison, and Set Expressions。
答案 1 :(得分:0)
我将使用PowerShell XML解析器([XML]
)创建XMLDocument:
$xml = [XML]'
<department>
<employee name="ABC">
<salary value="basic">5000</salary>
<salary value="allowance">8000</salary>
</employee>
<employee name="XYZ">
<salary value="basic">6000</salary>
<salary value="allowance">3000</salary>
</employee>
</department>'
然后就这么简单:
$xml.Department.Employee | % {
$allowance = [Int]($_.salary | ? {$_.value -eq 'allowance'}).'#text'
$basic = [Int]($_.salary | ? {$_.value -eq 'basic'}).'#text'
If ($allowance -ge $basic) {$Name = $_.name}
}
答案 2 :(得分:0)
在您的示例中,$ _。Node.employee.salary.value只是一个字符串数组,因此cmd不能引用任何属性,而$ basic和$ allowance最终为空白。另外,因为只有一个部门,所以foreach只循环一次。
这样,您已经在招募一系列员工,而不是一个部门。我也将节点属性弄乱了。 $ basic和$ allowance仍然是具有value和#text属性的对象。我输出匹配的雇员对象。这有点像您要尝试做的。比较必须为[int],否则'500'大于'4000'。
(Select-Xml /department/employee salary.xml).node |
ForEach {
$basic = $_.salary | where value -eq basic
$allowance = $_.salary | where value -eq allowance
if([int]$allowance.'#text' -ge $basic.'#text') {
$_ | select name,
@{n='basic'; e={$basic.'#text'}},
@{n='allowance'; e={$allowance.'#text'}}
}
}
name basic allowance
---- ----- ---------
ABC 5000 8000