【问题标题】:Rename Files To Fit Standard重命名文件以符合标准
【发布时间】:2017-02-12 03:37:43
【问题描述】:

在人事文件夹中,有由人事主管创建的有关员工辅导的文件。这些文件 ALWAYS 的命名约定应类似于

Supervisorname.SXXEXX.NameOfIssue.doc

所以进一步细分:

  • 主管姓名 = Bob Godfrey
  • SXX = 规定编号(01 - 99 始终为 2 位数字,但并非所有数字都使用)
  • EXX = 员工编号(始终为 2 位,我们还没有达到需要移动到 3 位或 E 以外的差异前缀的地步......)

因此示例名称将是 Bob Godfrey.S48E99.Issue With Blue.doc - 但是,由于某些主管没有遵守规则,因此有些文件没有 . 分隔符,我们的文件看起来像

Bob Godfrey - S48E99 - Issue With Blue.doc
Bob Godfrey X S48E99 - Issue With Blue.doc
Bob Godfrey S48E99 - Issue With Blue.doc

出于规范化的目的,(并且为了我不要在此过程中拔出头发)我尝试使用以下语法来获取这些异常值并现在重命名它们(大约有 300 个),而这似乎可以正常执行, 文件不会被重命名。

我需要更改什么才能使这些文件相应地重命名?

Get-ChildItem -Path R:\Personnel\ -Filter *.doc |
    Rename-Item -NewName { $_.BaseName.Replace(" - ", ".") + $_.Extension } -Verbose

Get-ChildItem -Path R:\Personnel\ -Filter *.doc |
    Rename-Item -NewName { $_.BaseName.Replace(" X ", ".") + $_.Extension } -Verbose

【问题讨论】:

  • 如果我没记错的话 - 示例行不应该在 SXX 和 EXX 之间有一个点吗?
  • @LotPings - 不,SXX 和 EXX 之间不应该有一个点。

标签: powershell powershell-4.0


【解决方案1】:

使用正则表达式替换将匹配项围绕文件名的规定/员工编号部分:

Rename-Item -NewName { $_.Name -replace ' (?:[-X] )?(S\d\dE\d\d)(?: [-X])? ', '.$1.' }

【讨论】:

  • 我认为这与规定号前面的单个空格不匹配。
  • 如何添加此语法的路径?
  • @LotPings 你是对的。我忘记将非捕获组设为可选。固定。
  • @BellHopByDayAmetuerCoderByNigh 你没有。为什么要这样做?
【解决方案2】:
$Pattern=[RegEx]'^([^-.]+?)(\.| | X | - )(S\d{2})\.*(E\d{2,3})(\.| - )([^\.]+)(\.doc)$'
$Replace='$1.$3.$4.$6$7'
GCI -Path R:\Personnel\ -Filter *.doc | Rename-Item -NewName { $_.Name -replace $Pattern,$Replace}

$Pattern 有 7 个组

  1. 主管组([^-.]+?) neg.class,无 - 或点至少一个字符,懒惰
  2. 分隔符组(\.| | X | - ) 点或空格或x 或-
  3. 组为规定号(S\d{2}) S 和 2 位数字(可能后跟一个点)\.*
  4. 集团员工编号(E\d{2,3})E和两位或三位数字
  5. 组分隔符(\.| - ) 一个点或-
  6. 群发([^\.]+) neg.class 除了点之外的所有内容至少一个字符
  7. 将分机(\.doc)分组在行尾$

【讨论】:

  • 如何为这个语法添加路径?
  • @BellHopByDayAmetuerCoderByNigh 你可以优先使用Set-Location 或使用Pushd,但我包含了你原来的命令。
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多