【问题标题】:Powershell script to rename files用于重命名文件的 Powershell 脚本
【发布时间】:2013-04-01 06:04:04
【问题描述】:

我有一堆文件的名称以数字开头,可能在两个数字之一之后包含空格和破折号,然后有时(有时没有)在我要保留的名称的第一个字母字符之前有一个空格,即:

2-01 Dazed And Confused.txt(我想把这个重命名为 Dazed And Confused.txt)

或者

02 - Uncle Salty.txt(我想重命名为 Uncle Salty.txt)

或者

02-The Night Before.txt(我想重命名为The Night Before.txt)

【问题讨论】:

  • list 脚本将从目录中获取文件列表并重命名它们。

标签: powershell powershell-3.0


【解决方案1】:

Move-ItemRename-Item cmdlet 可以直接从管道接受源并使用脚本块提供新名称:

dir | Move-Item -Destination { $_.Name -replace '^([0-9\-\s]*)' }

dir | Rename-Item -NewName { $_.Name -replace '^([0-9\-\s]*)' }

【讨论】:

    【解决方案2】:
    dir c:\tmp | % {
         mv $_.FullName $(Join-Path $_.Directory ($_.Name -replace "^([0-9\-\s]*)",'').Trim());
    }
    

    如果需要递归处理YourDirectory,在dir后面加上-recurse

    【讨论】:

    • 这不适用于第二个示例。改用^([0-9\-\s]*)
    • 这对我需要重命名的 600 多个文件中的大约 95% 有效。我第一次在我想重命名的文件子集上运行它时确实抛出了一个错误,关于将文件移动到同一个文件夹,但它确实重命名了文件。我第二次在整个文件集上运行脚本时它没有给我一个错误。谢谢你,很棒的脚本。
    • Move-ItemRename-Item cmdlet 可以直接从管道接受源并使用脚本块提供新名称:dir | move-item -destination { $_.Name -replace '^([0-9\-\s]*)' }dir | rename-item -newname { $_.Name -replace '^([0-9\-\s]*)' }
    • @EmperorXLII 您应该将此作为单独的答案发布,因为我相信它在可理解性和简洁性方面优于任何现有答案。
    【解决方案3】:

    试试这样的:

    $re = '^\d+\s*-\d*\s*(.*)$'
    $recurse = $false
    
    Get-ChildItem "C:\some\folder" -Recurse:$recurse | ? {
      -not $_.PSIsContainer -and $_.Name -match $re
    } | % {
      Move-Item $_.FullName (Join-Path $_.Directory $matches[1])
    }
    

    如果您希望连字符是可选的,请将正则表达式更改为 '^\d+\s*-?\d*\s*(.*)$'

    如果您想递归到子文件夹,请将 $recurse 更改为 $true

    【讨论】:

    • 这个改变了大部分文件,但大约 15% 没有重命名。
    • @user577651 这 15% 的文件名是什么样的?
    猜你喜欢
    • 2015-06-03
    • 2011-10-25
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多