解析XML并重命名文件名中的特殊char(XML和位置)

时间:2019-01-31 10:06:55

标签: xml powershell special-characters rename file-rename

我处于将文件从Unix复制到Windows的情况。 Unix中的文件具有Windows不会接受的特殊字符。

我有一个XML文件,每个文件都带有标签。该XML文件将在其中一个应用程序中传递以进行处理。

  1. 拾取一个XML文件。
  2. 通读属性并找到<file>
  3. 检查属性值是否具有特殊字符。
  4. 如果没有特殊字符,请转到下一个文件。如果该值具有特殊字符-转到该位置,并用有效的字符重命名该特殊字符(例如,将/重命名为-)。
  5. 在XML文件标记中执行相同的重命名。
  6. 转到下一个文件标签并获取下一个XML内容。

我当时正在考虑在PowerShell中进行操作。

示例XML:

<import>
    <node type="document" action="create">
        <location>XXXXXX</location>
        <title>log_0.log</title>
        <created>20190117</created>
        <file>\test*\log/0/.log</file>
    </node>

<File>在上面的示例中有两个特殊字符...一个在文件夹名称(*)中,另一个在文件名(//)中。

1 个答案:

答案 0 :(得分:0)

要解决此问题,请自行调整以下片段。

$x=[xml]@'
<import>
  <node type="document" action="create">
    <location>XXXXXX</location>
    <title>log_0.log</title>
      <created>20190117</created>
      <file>\test*\log/0/.log</file>
  </node>
</import>
'@
$x.SelectNodes('/import/node/file') |
  ForEach-Object {
    $file = $_.'#text'
    [char[]]$file |
      ForEach-Object {
        if( [System.IO.Path]::GetInvalidPathChars() -contains $_ ) {
          $file = $file.Replace($_, '_')
        }
        if( $_ -ne [System.IO.Path]::DirectorySeparatorChar -and
            [System.IO.Path]::GetInvalidFileNameChars() -contains $_ ) {
          $file = $file.Replace($_, '_')
        }
      }
    $file
  }

输出:

\test_\log_0_.log