微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PowerShell 使用 XML 重命名文件

如何解决PowerShell 使用 XML 重命名文件

目前我有一个文件C:\Call Archive\,其 XML 文件index.xml 和大量 .wav 文件,它们的名称在您查看时没有任何意义。 AT1_ID1_TT3_ID6-1623089222.5534.WAV

之类的名称

我想做的是采用 XML 结构并根据 XML 中的标签重命名每个 .wav 文件

源数据:

<all>
  <recording_index recapp_id="" recapp_name="" last_generated="0">
    <day_index date="2021-06-07">
      <recording target_name="UnkNown recording" filename="warning%3A" filesize="0" date="1969-12-31 19:00" source="" destination=""/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623089222.5534.WAV" filesize="40K" date="2021-06-07 14:07" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623089304.5536.WAV" filesize="42K" date="2021-06-07 14:08" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091000.5538.WAV" filesize="11K" date="2021-06-07 14:36" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091138.5540.WAV" filesize="14K" date="2021-06-07 14:39" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091201.5542.WAV" filesize="14K" date="2021-06-07 14:40" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091227.5544.WAV" filesize="43K" date="2021-06-07 14:41" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091276.5546.WAV" filesize="31K" date="2021-06-07 14:41" source="John Doe" destination="5555512345"/>
    </day_index>
  </recording_index>
</all>

理想的文件名应该是 06-07-2021_John Doe_5555512345.wav。请注意,如果可能,日期应采用 MM-DD-YYYY 格式。

任何事情都会有帮助!

解决方法

您只需要循环并进行重命名。类似于以下内容:

# Establishing test data:
$XML = 
@"
<all>
  <recording_index recapp_id="" recapp_name="" last_generated="0">
    <day_index date="2021-06-07">
      <recording target_name="Unknown recording" filename="warning%3A" filesize="0" date="1969-12-31 19:00" source="" destination=""/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623089222.5534.WAV" filesize="40K" date="2021-06-07 14:07" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623089304.5536.WAV" filesize="42K" date="2021-06-07 14:08" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091000.5538.WAV" filesize="11K" date="2021-06-07 14:36" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091138.5540.WAV" filesize="14K" date="2021-06-07 14:39" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091201.5542.WAV" filesize="14K" date="2021-06-07 14:40" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091227.5544.WAV" filesize="43K" date="2021-06-07 14:41" source="John Doe" destination="5555512345"/>
      <recording target_name="10 Digit Dialing" filename="AT1_ID1_TT3_ID6-1623091276.5546.WAV" filesize="31K" date="2021-06-07 14:41" source="John Doe" destination="5555512345"/>
    </day_index>
  </recording_index>
</all>
"@

$XML = [XML]$XML

# This is the real work:
$xml.all.recording_index.day_index.recording |
ForEach-Object{
    $Date = (Get-Date $_.Date).ToString('MM-dd-yyyy')
    $Newname = "{0}_{1}_{2}.{3}" -f $Date,$_.source,$_.destination,$_.filename.Split('.')[-1]
    $Newname
    Rename-Item -Path $_.filename -NewName $Newname
}

对于您感兴趣的每个 XML 元素,您只需获取属性并将它们连接起来以获得新名称,然后只需使用 Rename-Item 执行重命名。我对文件位置有点怀疑,因为原始文件的完整路径不在 XML 中。您可能需要从或 CD 运行到包含文件的目录。

我也担心命名冲突。我不知道这是否只是样本数据的一个功能,如果是一个问题,您可能需要更细化时间戳以确保唯一的文件名。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?