首页 > 解决方案 > 如何在powershelll中进行用户替换

问题描述

$xml = [xml](Get-Content C:\Users\ritsharma\Desktop\original.xml )
$nodes=$xml.selectnodes("/POWERMART/REPOSITORY/FOLDER/MAPPING/TRANSFORMATION/TRANSFORMFIELD[@NAME="*_DT*" or @NAME="*_NULL*"]")
$nodes -Replace '_NULL','this_is_working'
$nodes -Replace '_DT','this_is_working'
$xml.save("C:\Users\ritsharma\Desktop\original.xml")

在这里,我将向下钻取直到具有属性“NAME”的子节点“Transformfield”。我想用 'this is working' 替换具有值 '_NULL' 或 "_DT" 的属性 "NAME" 的值。此代码可以正常工作,但不提供任何输出。在文件中看不到更改。

这是xml文件

<POWERMART>
<REPOSITORY NAME="">
<FOLDER NAME="SA_Test" GROUP="" OWNER="AD" SHARED="NOTSHARED" DESCRIPTION="" 
 PERMISSIONS="rwx------" UUID="86fcaa4c-e96d-4eea-8263-0ee22273ee23">
    <EXPRMACRO DESCRIPTION ="" EXPRESSION ="IIF( NULL_INPUT =&apos;?&apos; ,NULL,TO_DATE( DATE_INPUT,&apos;MM/DD/YYYY&apos;))" MACROTYPE ="Public" NAME ="Convert_Dates" OBJECTVERSION ="1" PROTOTYPE ="DATE/TIME Convert_Dates( NULL_INPUT as string, DATE_INPUT as string )" RETURNTYPE ="date/time" VERSIONNUMBER ="1">
    <MACROARGUMENT ARGORDER ="1" DATATYPE ="string" NAME ="NULL_INPUT" PRECISION ="1" SCALE ="0"/>
    <MACROARGUMENT ARGORDER ="2" DATATYPE ="string" NAME ="DATE_INPUT" PRECISION ="10" SCALE ="0"/>
</EXPRMACRO>
<MAPPING DESCRIPTION ="" ISVALID ="YES" NAME ="M_demo_1_onetoone" OBJECTVERSION ="1" VERSIONNUMBER ="1">
    <TRANSFORMATION DESCRIPTION ="" NAME ="EXP_escrowfile" OBJECTVERSION ="1" REUSABLE ="NO" TYPE ="Expression" VERSIONNUMBER ="1">
        <TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="Demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="1" SCALE ="0"/>
        <TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="13" SCALE ="0"/>
        <TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="11" SCALE ="2"/>
        <TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="2"/>
        <TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="3" SCALE ="2"/>
        <TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="1" SCALE ="0"/>
        <TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="4"/>
        <TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="demo" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="11" SCALE ="2"/>
        <TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="ST_CHG_DT" EXPRESSIONTYPE ="GENERAL" NAME ="ST_BCB_DT" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="10" SCALE ="0"/>
        <TRANSFORMFIELD DATATYPE ="string" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="ST_CHG_NULL" EXPRESSIONTYPE ="GENERAL" NAME ="ES_DISB_ST_CHG_NULL" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="1" SCALE ="0"/>
        <TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="ES_E_PST_DUE_30_BA" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="2"/>
        <TRANSFORMFIELD DATATYPE ="decimal" DEFAULTVALUE ="" DESCRIPTION ="" EXPRESSION ="demo" EXPRESSIONTYPE ="GENERAL" NAME ="ES_E_PST_DUE_60_BA" PICTURETEXT ="" PORTTYPE ="INPUT/OUTPUT" PRECISION ="15" SCALE ="2"/>
</TRANSFORMATION>
 </MAPPING>

标签: powershell

解决方案


这样做的一种方法是使用点符号来查找感兴趣的节点,循环并更改NAME属性:

[xml]$xml = Get-Content 'C:\Users\ritsharma\Desktop\original.xml' -Raw

# unlike XPath, dot-notation works case-insensitive
$xml.POWERMART.REPOSITORY.FOLDER.MAPPING.TRANSFORMATION.TRANSFORMFIELD | 
    Where-Object {$_.NAME -match '_(DT|NULL)'} | 
    ForEach-Object {
        $_.SetAttribute('NAME', $_.NAME.Replace($matches[1], 'this_is_working'))
    }

$xml.Save('C:\Users\ritsharma\Desktop\updated_original.xml')

您发布的 XML 无效,因为它缺少几个结束标记。

它应该是:

<POWERMART>
  <REPOSITORY NAME="">
    <FOLDER NAME="SA_Test" GROUP="" OWNER="AD" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx------" UUID="86fcaa4c-e96d-4eea-8263-0ee22273ee23">
      <EXPRMACRO DESCRIPTION="" EXPRESSION="IIF( NULL_INPUT ='?' ,NULL,TO_DATE( DATE_INPUT,'MM/DD/YYYY'))" MACROTYPE="Public" NAME="Convert_Dates" OBJECTVERSION="1" PROTOTYPE="DATE/TIME Convert_Dates( NULL_INPUT as string, DATE_INPUT as string )" RETURNTYPE="date/time" VERSIONNUMBER="1">
        <MACROARGUMENT ARGORDER="1" DATATYPE="string" NAME="NULL_INPUT" PRECISION="1" SCALE="0" />
        <MACROARGUMENT ARGORDER="2" DATATYPE="string" NAME="DATE_INPUT" PRECISION="10" SCALE="0" />
      </EXPRMACRO>
      <MAPPING DESCRIPTION="" ISVALID="YES" NAME="M_demo_1_onetoone" OBJECTVERSION="1" VERSIONNUMBER="1">
        <TRANSFORMATION DESCRIPTION="" NAME="EXP_escrowfile" OBJECTVERSION="1" REUSABLE="NO" TYPE="Expression" VERSIONNUMBER="1">
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="Demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="13" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="3" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="4" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_DT" EXPRESSIONTYPE="GENERAL" NAME="ST_BCB_DT" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="10" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_NULL" EXPRESSIONTYPE="GENERAL" NAME="ES_DISB_ST_CHG_NULL" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_30_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_60_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
        </TRANSFORMATION>
      </MAPPING>
    </FOLDER>
  </REPOSITORY>
</POWERMART>

使用我的答案中的代码会给你一个的xml 文件updated_original.xml,如下所示:

<POWERMART>
  <REPOSITORY NAME="">
    <FOLDER NAME="SA_Test" GROUP="" OWNER="AD" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx------" UUID="86fcaa4c-e96d-4eea-8263-0ee22273ee23">
      <EXPRMACRO DESCRIPTION="" EXPRESSION="IIF( NULL_INPUT ='?' ,NULL,TO_DATE( DATE_INPUT,'MM/DD/YYYY'))" MACROTYPE="Public" NAME="Convert_Dates" OBJECTVERSION="1" PROTOTYPE="DATE/TIME Convert_Dates( NULL_INPUT as string, DATE_INPUT as string )" RETURNTYPE="date/time" VERSIONNUMBER="1">
        <MACROARGUMENT ARGORDER="1" DATATYPE="string" NAME="NULL_INPUT" PRECISION="1" SCALE="0" />
        <MACROARGUMENT ARGORDER="2" DATATYPE="string" NAME="DATE_INPUT" PRECISION="10" SCALE="0" />
      </EXPRMACRO>
      <MAPPING DESCRIPTION="" ISVALID="YES" NAME="M_demo_1_onetoone" OBJECTVERSION="1" VERSIONNUMBER="1">
        <TRANSFORMATION DESCRIPTION="" NAME="EXP_escrowfile" OBJECTVERSION="1" REUSABLE="NO" TYPE="Expression" VERSIONNUMBER="1">
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="Demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="13" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="3" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="4" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="demo" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="11" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_DT" EXPRESSIONTYPE="GENERAL" NAME="ST_BCB_this_is_working" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="10" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="string" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="ST_CHG_NULL" EXPRESSIONTYPE="GENERAL" NAME="ES_DISB_ST_CHG_this_is_working" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="1" SCALE="0" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_30_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
          <TRANSFORMFIELD DATATYPE="decimal" DEFAULTVALUE="" DESCRIPTION="" EXPRESSION="demo" EXPRESSIONTYPE="GENERAL" NAME="ES_E_PST_DUE_60_BA" PICTURETEXT="" PORTTYPE="INPUT/OUTPUT" PRECISION="15" SCALE="2" />
        </TRANSFORMATION>
      </MAPPING>
    </FOLDER>
  </REPOSITORY>
</POWERMART>

如您所见,两个<TRANSFORMFIELD>Name 属性已更新。


推荐阅读