【发布时间】:2018-02-09 20:00:34
【问题描述】:
我有一个 XML 文件,其中包含;
<?xml version="1.0"?>
<JobContainer version="2017-1">
<Object name="MainObject" type="TDM_Container">
<Object name="OrderList" type="TDM_List_Order">
<List name="Items">
<Object type="TDM_Item_Order">
<Property name="IntOrderID" value="3I-390049-SZEPLOUSKI-793269"/>
</Object>
</List>
</Object>
<Object name="ModelJobList" type="TDM_List_ModelJob">
<List name="Items">
<Object type="TDM_Item_ModelJob">
<Property name="ModelJobID" value="MJ5393C2FF84844DE38BC481CB5AD36D93"/>
</Object>
</List>
</Object>
<Object type="TDM_Item_ModelElement">
<Property name="ModelJobID" value="MJ5393C2FF84844DE38BC481CB5AD36D93"/>
<Property name="ProcessStatusID" value="psScanned"/>
<Property name="ProcessLockID" value="plReady"/>
<Property name="ManufacturingProcessID" value="57435_ManufacturingProcess17"/>
<Property name="ManufacturerID" value="27606"/>
</Object>
<Object type="TDM_Item_ModelElement">
<Property name="ModelJobID" value="MJ5393C2FF84844DE38BC481CB5AD36D93"/>
<Property name="ProcessStatusID" value="psClosed"/>
<Property name="ProcessLockID" value="plReady"/>
<Property name="ManufacturingProcessID" value="27606_ManufacturingProcess8"/>
<Property name="ManufacturerID" value="27606"/>
</Object>
<Object type="TDM_Item_ModelElement">
<Property name="ModelJobID" value="MJ5393C2FF84844DE38BC481CB5AD36D93"/>
<Property name="ProcessStatusID" value="psScanned"/>
<Property name="ProcessLockID" value="plReady"/>
<Property name="ManufacturingProcessID" value="57435_ManufacturingProcess17"/>
<Property name="ManufacturerID" value="27606"/>
</Object>
</List>
</Object>
<Object name="ElementList" type="TDM_List_Element">
<List name="Items">
<Object type="TDM_Item_Element">
<Property name="Anatomical" value="False"/>
</Object>
</List>
</Object>
</Object>
</JobContainer>
我需要找到 value = "27606_ManufacturingProcess8" 的 ManufacturingProcessID 属性,如果找到它,则查看同一节点下的 ProcessStatusID 属性,如果 value = "psClosed" 则我需要移动 xml 文件到另一个文件夹。
我下面的代码有效,但它仅在节点是第一个时有效。但有时节点不是第一个节点。如果不是第一个节点,如何找到这个节点。
Get-ChildItem $sSourceFolder | ForEach-Object -Process {
if ($_.PSIsContainer)
{
# Store subfolder path in a variable
$sFolderPath = $_.FullName
$sFolderName = Split-Path $sFolderPath -Leaf
Get-ChildItem $sFolderPath | Where {$_.Name -like $sFolderName + '.xml'} | foreach{
$sFilepath = $_.FullName
[xml]$xml2 = Get-Content $sFilepath
$sValueMPI = $xml2.SelectNodes('//Property') | ?{$_.name -eq "ManufacturingProcessID"} | select -First 1 -ExpandProperty value
if ($sValueMPI -eq '27606_ManufacturingProcess8')
{
$sValue = $xml2.SelectNodes('//Property') | ?{$_.name -eq "ProcessStatusID"} | select -First 1 -ExpandProperty value
if ($sValue -eq 'psClosed')
{
# If destination folder already exists, add sequential suffix like (1), (2), etc.
if (Test-Path ($sDestFolder + $sFolderName))
{
$j = 1
While (Test-Path ($sDestFolder + "$sFolderName($j)"))
{
$j = $j + 1
}
$sFolderName = "$sFolderName($j)"
}
# Move folder to archive destination
Move-Item $sFolderPath ($sDestFolder + $sFolderName) -ErrorVariable MoveError -Verbose -Force *>> $sLogPath
if (!($MoveError)) {$i = $i + 1} #if no move error, then increment counter
}
}
}
}
}
【问题讨论】: