Powershell查找并替换跨越两行的文本

时间:2019-01-24 18:50:30

标签: xml powershell

我有一个不寻常的XML数据结构,需要在其中更新作业编号属性值。

<?xml version="1.0"?>
<MiscContainer version="2018-1">
  <Object name="MainObject" type="TDM_Container">
    <Object name="OrderList" type="TDM_List_Order">
      <List name="Items">
        <Object type="TDM_Item_Order">
          <Property name="TraySystemType" value="stNone"/>
        </Object>
      </List>
    </Object>
    <Object name="CustomDataList" type="TDM_List_CustomData">
      <List name="Items">
        <Object type="TDM_Item_CustomData">
          <Property name="CustomDataID" value="CDAB5D3000B66D45D69F4F27074E55E0D8"/>
          <Property name="FieldCaption" value="ZB Encode Account#"/>
          <Property name="Value" value="New"/>
          <Property name="Kind" value="cdkPublic"/>
        </Object>
        <Object type="TDM_Item_CustomData">
          <Property name="CustomDataID" value="CDB0C755BF8BEB45419DED0B8D4A5CF8B4"/>
          <Property name="FieldCaption" value="PO#"/>
          <Property name="Value" value="000009"/>
          <Property name="Kind" value="cdkPublic"/>
        </Object>
        <Object type="TDM_Item_CustomData">
          <Property name="CustomDataID" value="CDB10DBE4FD0BD4CAA96B22AA6CD9A83C2"/>
          <Property name="FieldCaption" value="Job Number"/>
          <Property name="Value" value="1234"/>
          <Property name="Kind" value="cdkPublic"/>
        </Object>
        <Object type="TDM_Item_CustomData">
          <Property name="CustomDataID" value="CDD69CA4A79BE145369C3FD889E18E0BCF"/>
          <Property name="FieldCaption" value="coupon 1"/>
          <Property name="Value" value="3123213"/>
          <Property name="Kind" value="cdkPublic"/>
        </Object>

我无法使用XML对象弄清楚它,因此我尝试仅使用字符串替换功能。替换功能的问题是我需要跨两行搜索以找到唯一的匹配项。我使用了正则表达式(.*)来处理根本没有值的可能性,但是我需要插入一个值。

这是我的代码:

$Folder = '\\3ipbg-fs-p01\private\UDI-Data-3i-Dev\inbound\archive\'

Get-ChildItem $Folder | ForEach-Object -Process {
    if ($_.PSIsContainer) {
        $sFolderPath = $_.FullName
        $sFolderName = Split-Path $sFolderPath -Leaf

        Get-ChildItem $sFolderPath | Where {
            $_.Name -like $sFolderName + '.xml'
        } | foreach {
            $sFilepath = $_.FullName

            (Get-Content $sFilepath) -replace '<Property name="FieldCaption" value="Job Number"/>
          <Property name="Value" value="(.*)"/>','<Property name="FieldCaption" value="Job Number"/>
          <Property name="Value" value="1234"/>' | Out-File -Encoding Ascii $sFilepath
        }
    }
}

但是,由于CR和LF,它不起作用。仅出于测试目的,如果我删除多行,它可以工作,但是我需要多行,因为单行不是唯一的。

希望有人可以帮助替换字符串或XML路由。

0 个答案:

没有答案