【问题标题】:Rename files with Powershell if file has certain structure如果文件具有特定结构,则使用 Powershell 重命名文件
【发布时间】:2019-07-25 02:02:55
【问题描述】:

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

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

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

我只想重命名这些文件,其他的应该保持不变

【问题讨论】:

    标签: powershell rename


    【解决方案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) 如果新文件名是和旧的一样。
    • 在传递给-replace 的正则表达式中,positive look-ahead assertion(?=...)(在输入字符串的开头匹配 (^))查找子表达式 \(\d+\)\. 的匹配项,而不考虑它匹配的内容应该替换的一部分。实际上,只有输入字符串的开始 位置 (^) 被匹配和“替换”。

      • 子表达式\(\d+\)\.匹配文字((转义为\(),后跟1个或多个(+)数字(\d),后跟文字)和文字@987654345 @ (\.),它标志着文件扩展名的开始。 (如果您想匹配没有扩展名的文件名,请将 .\ 替换为 $,即输入结束断言)。
    • 因此,替换操作数 'Subject is missing ' 被有效地添加到输入字符串,例如,(1).txt 返回 Subject is missing (1).txt

    【讨论】:

    • 作为positive lookahead 的替代方案,只需将锚^ 替换为要添加的文本:$_.Name -replace '^(?=\(\d+\)$)', 'Subject is missing '
    • 我尝试了以下 Get-ChildItem -File | Rename-Item -NewName { $_.Name -replace '^(?=\(\d+\)$)', 'Subject is missing ' } 它没有改变,文件 (1), (2), (3 ) 都保持不变。
    • 没有空格,只有 '(1)' 和其他数字。但是1个单个文件的结构是'(*)'
    • 对他们中的大多数人来说,它工作得很好,我只有一个错误。重命名项目:无法将参数绑定到参数“NewName”,因为它是一个空字符串。在 line:1 char:114 但我想那是因为那是一个空文件名。我现在用其他代码解决了这个问题。
    猜你喜欢
    • 2023-03-03
    • 2020-01-24
    • 1970-01-01
    • 2014-02-21
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多