我一直在使用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。