Powershell 重命名文件以符合标准

Powershell 重命名文件以符合标准,powershell,powershell-4.0,Powershell,Powershell 4.0,在人事文件夹中,有人事主管创建的有关员工辅导的文件。这些文件的命名约定应始终为 Supervisorname.SXXEXX.NameOfIssue.doc 因此,进一步细分如下: Supervisorname=Bob Godfrey SXX=规定编号(始终为2位,范围为01-99,但并非所有数字都使用) EXX=员工编号(始终为2位数,我们还没有达到需要移动到3位数或除E以外的差异前缀的程度…) 因此,示例名称应为Bob Godfrey.S48E99.Issue With Blue.doc

在人事文件夹中,有人事主管创建的有关员工辅导的文件。这些文件的命名约定应始终为

Supervisorname.SXXEXX.NameOfIssue.doc
因此,进一步细分如下:

  • Supervisorname=Bob Godfrey
  • SXX=规定编号(始终为2位,范围为01-99,但并非所有数字都使用)
  • 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

使用正则表达式替换以文件名的约定/员工编号部分为中心进行匹配:

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

  • 主管组
    ([^-.]+?)
    neg.class,无或点至少一个字符,惰性
  • 分隔符
    (\.| X |-)
    的分组可以是点或空格,也可以是
    X
    -
  • 规定编号
    (S\d{2})
    S和2位数字(可能后跟一个点)
    \.*
  • 集团员工编号
    (E\d{2,3})
    E和两位或三位数字
  • 分组分隔符
    (\.\124;-)
    一个点或
    -
  • 组问题
    ([^\.]+)
    neg.class除点以外的所有内容至少一个字符
  • 将锚定在行末尾的扩展名
    (\.doc)
    分组
    $

  • 如果我没弄错的话-示例行中的SXX和EXX之间不应该有点吗?@LotPings-不应该在SXX和EXX之间有点。我认为这与规定编号前面的单个空格不匹配。我如何将路径添加到此语法中?@LotPings您是对的。我忘了将非捕获组设为可选组。修正了。@bellhopbayametuercoderbynigh您没有。为什么要这样做?我如何为该语法添加路径?@BellHopByDayAmetuerCoderByNigh您可以事先
    设置位置
    或使用
    Pushd
    ,但我包含了您的原始命令。
    $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}