我一直在使用Powershell来简化创建目录,重命名和移动文件中的重复性任务。我正在处理视频和PDF文件,其中文件名所需的语法非常明确。到目前为止,我已经能够纠正遇到的所有常见错误,但是这个错误让我很困惑。

我的文件的正确语法包括:

01A-50_02A-50-CIPP-PRE.MP4
01AA-50_02AA-50-CIPP-PNSL.PDF
W01AA-48_02AA-48-CIPP-PST-CMP.MPG

我收到了大量看起来像这样的文件:

01A-50-02A-50-CIPP-PRE.MP4
01AA-50-02AA-50-CIPP-PNSL.PDF
W01AA-48-02AA-48-CIPP-PST-CMP.MPG

我需要用下划线替换第二个破折号,同时保持其他破折号不受影响。我可以在excel的帮助下以其他方式批量执行此操作,但是我希望有一个短代码可以找到并更正语法错误,而不必将列表导出到excel,使用文本到列,然后连接字母数字部分一起回到。我也不想手动更正所有这些文件名。

根据我的研究,不可能定位要替换的特定字符。我以为最接近的想法是找到了一个涉及REGEX的解决方案,并确定并替换了一种模式。我还没有做任何有 build 性的事情。

我将使用此代码的方式是:打开包含未命名文件的文件夹,在其中打开Powershell窗口,从桌面上的txt文件复制代码,然后将其粘贴到Powershell中。

任何帮助,将不胜感激。

最佳答案

-replace运算符与正则表达式一起使用:

Get-ChildItem |
  Rename-Item -NewName { $_.Name -replace '^([^_-]+-[^_-]+)-', '$1_' } -WhatIf
-WhatIf预览重命名操作;删除它以执行实际的重命名。
  • 正则表达式'^([^_-]+-[^_-]+)-'使用文件捕获组(-)捕获文件名开头(^)的前两个(...)分隔的 token ,以捕获除第二个-之外的 token 。
  • [^_-]+捕获既不是-也不是_的所有非空字符。还排除了_,以防止文件名已经正确的误报。对于那些,不排除_将匹配前三个 token ,并在其中插入其他_
  • 然后,
  • 替换操作数$1_使用第一个(也是唯一的)捕获组($1)的值,然后是文字_来替换正则表达式匹配的内容,这将第二个-有效地替换为_
  • 如果给定的文件名与正则表达式不匹配(如果已经正确),则该名称按原样返回,这在Rename-Item上下文中是一个安静的no-op。
  • 10-08 07:18
    查看更多