【问题标题】:Parse XML and rename special char in filename (both XML and location)解析 XML 并重命名文件名中的特殊字符(XML 和位置)
【发布时间】:2019-06-24 18:21:13
【问题描述】:

我正在将文件从 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>

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

【问题讨论】:

  • 到目前为止你尝试过什么?将您目前拥有的代码添加到您的问题中。这样就更容易为您指明正确的方向。
  • @kaspermoerch - 我试图单独做 - unix 和 xml。 Unix ..我试过 shopt -s globstar rename "s/\:?*[|]/_/g" ** xml 我还没弄清楚..我目前没有任何代码

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


【解决方案1】:

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

$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多