【问题标题】:Powershell add suffix to filenames, based on prefixPowershell根据前缀为文件名添加后缀
【发布时间】:2018-11-10 06:58:45
【问题描述】:

我有一个目录,其中包含许多已命名的文本文件:

1Customer.txt
2Customer.txt
...
99Customer.txt

我正在尝试创建将文件重命名为更合乎逻辑的 powershell 脚本:

Customer1.txt
Customer2.txt
...
Customer99.txt

前缀可以是 1 位到 3 位之间的任何值。

由于我是 powershell 新手,我真的不知道如何实现这一点。非常感谢任何帮助。

【问题讨论】:

    标签: powershell


    【解决方案1】:
    • 最直接的方法是 gci/ls/dir
    • 仅匹配以带有 a 的数字开头的 BaseName 正则表达式和管道
    • 重命名项目并从子匹配中构建新名称。

    ls |? BaseName -match '^(\d+)([^0-9].*)$' |ren -new {"{0}{1}{2}" -f $matches[2],$matches[1],$_.extension}
    

    没有别名的相同代码

    Get-ChildItem |Where-Obect {$_.BaseName -match '^(\d+)([^0-9].*)$'} |
        Rename-Item -NewName {"{0}{1}{2}" -f $matches[2],$matches[1],$_.extension}
    

    【讨论】:

      【解决方案2】:

      这是一种方法:

      Get-ChildItem .\Docs -File |
          ForEach-Object {
              if($_.Name -match "^(?<Number>\d+)(?<Type>\w+)\.\w+$")
              {
                  Rename-Item -Path $_.FullName -NewName "$($matches.Type)$($matches.Number)$($_.Extension)"
              }
          }
      

      行:

      $_.Name -match "^(?<Number>\d+)(?<Type>\w+)\.\w+$")
      

      获取文件名(例如'23Suppliers.txt')并对其执行模式匹配,提取数字部分(23)和'类型'部分('Suppliers'),将它们命名为'Number'和'分别键入'。这些由 PowerShell 存储在其自动变量 $matches 中,用于处理正则表达式。

      然后我们使用原始文件的详细信息重建新文件,例如文件的扩展名 ($_.Extension) 和匹配的类型 ($matches.Type) 和编号 ($matches.Number):

      "$($matches.Type)$($matches.Number)$($_.Extension)"
      

      【讨论】:

      • 太棒了。由于有大量其他文件类型(例如供应商、地址、销售订单),我怎样才能让这个文件获取任何具有数字前缀的文件?谢谢。
      • 这将工作,因为它代表格式为&lt;number&gt;&lt;type&gt;.txt 的任何文件名。例如,所有这些都可以工作:1Customer.txt23Suppliers.txt99Addresses.txt 等。只需稍作修改即可处理不同的文件扩展名。
      • 这很好,但我有超过 100 种不同的文件类型。它可以作为 的通配符吗?谢谢。
      • @Bandito 您可以与 BaseName 匹配,然后在重命名时重新添加扩展名。更新这些 if($_.BaseName -match "^(?&lt;Number&gt;\d+)(?&lt;Suffix&gt;\w+)")Rename-Item -Path $_.FullName -NewName "$($_.Directory)\$($matches.Suffix)$($matches.Number)$($_.Extension)"
      • @Bandito,我更新了我的示例,使其适用于不同的文件扩展名。
      【解决方案3】:

      我确信使用正则表达式有更好的方法,但以下是快速入门:

      $prefix = "Customer"
      Get-ChildItem C:\folder\*$prefix.txt  | Rename-Item -NewName {$prefix + ($_.Name -replace $prefix,'')}
      

      【讨论】:

        猜你喜欢
        • 2020-11-07
        • 2021-09-07
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        相关资源
        最近更新 更多