PowerShell / XML - 根据节点值将 xml 文件复制到文件夹

Tom*_*man 1 xml powershell copy file nodes

我对 PowerShell 相当陌生,但迄今为止使用它的能力有限。

所以,这是我的问题:我有 100,000 个 xml 文件,其中包含一个具有 State 值的节点。我想使用 PowerShell 读取文件,然后将文件复制到各自的 State 文件夹中。我可以让文件夹已经创建或者让 PS 脚本来完成。两者都可以,但我想了解如何执行以下操作:1. 将文件复制到特定文件夹,2. 创建文件夹,然后将文件复制到其中。

例子:

XML1

<Member>
  <LastName>LASTNAME1</LastName>
  <FirstName>FIRSTNAME1</FirstName>
  <AddressParent>
    <Address>
      <Type>HOME1</Type>
      <Address1>123 STREET</Address1>
      <State>FL</State>
    </Address>
  </AddressParent>
</Member>
Run Code Online (Sandbox Code Playgroud)

XML2

<Member>
  <LastName>LASTNAME2</LastName>
  <FirstName>FIRSTNAME2</FirstName>
  <AddressParent>
    <Address>
      <Type>HOME1</Type>
      <Address1>234 STREET</Address1>
      <State>NY</State>
    </Address>
  </AddressParent>
</Member>
Run Code Online (Sandbox Code Playgroud)

重申一下:我想读取单个文件夹中存在的文件。根据<State>节点将文件复制到各自的 State 文件夹中。

另外,每个 XML 文件有超过 1 个<State>节点,因此我需要使用绝对路径(不确定这是否是正确的术语)。

我想提前感谢大家,非常感谢你们提供的任何帮助。

Mat*_*sen 5

用于Select-Xml提取<State>每个文档中的第一个节点,然后根据该节点移动文件:

Get-ChildItem |Select-Xml -XPath '//State[1]' |ForEach-Object {
  $State = $_.Node.InnerText

  # Check to see if folder already exists, otherwise create it
  if(-not(Test-Path $State)){
    $null = mkdir $State
  }

  # Move the source file to the state folder
  Move-Item -LiteralPath $_.Path -Destination $State
}
Run Code Online (Sandbox Code Playgroud)

XPath 谓词的含义是:

//           # Anywhere in the node tree
  State      # Find a <State> node
       [1]   # Select the one at position 1
Run Code Online (Sandbox Code Playgroud)