如果文件具有特定结构,请使用Powershell重命名文件

时间:2019-03-03 17:33:16

标签: powershell rename

我正在尝试使用相同名称结构重命名多个文件夹中的文件。我得到了以下文件:

  • (1).txt
  • (2).txt
  • (3).txt

我想在其前面添加以下文本:“主题丢失”

我只想重命名这些文件,其他所有文件都应保持不变

1 个答案:

答案 0 :(得分:1)

LotPings的帽子提示,建议在正则表达式中使用先行断言。

Get-ChildItem -File | Rename-Item -NewName { 
  $_.Name -replace '^(?=\(\d+\)\.)', 'Subject is missing '
} -WhatIf

-WhatIf 预览重命名操作;删除它以执行实际的重命名。

  • Get-ChildItem -File仅枚举文件,但没有名称过滤器-虽然您可以尝试预先应用基于通配符的过滤器-例如-Filter '([0-9]).*'-您不能确保< em>多位数字名称(例如(13).txt)正确匹配。

    • 不过,您可以使用-Filter '(*).*'
    • 对结果进行预过滤
  • Rename-Item调用使用delay-bind script block来获得新名称。

    • 利用了以下事实:(a)-rename如果正则表达式不匹配,则返回未修改的输入字符串;(b)Rename-Item如果新文件名与旧文件名相同。
  • 在传递给-replace的正则表达式中,positive look-ahead assertion (?=...)(在输入字符串(^的开头匹配))寻找一个匹配子表达式\(\d+\)\.,而不考虑它与应替换 的一部分匹配的内容。实际上,只有输入字符串的起始位置^)会被匹配并“替换”。

    • 子表达式\(\d+\)\.匹配文字((转义为\(),后跟1个或更多(+)个数字(\d),后跟文字)和文字.\.),它们标志着文件扩展名的开始。 (如果要匹配没有扩展名的文件名,请将.\替换为$,即输入结束断言。)
  • 因此,替换操作数'Subject is missing '实际上被前缀到输入字符串,以便例如(1).txt返回Subject is missing (1).txt