【问题标题】:Programmatically edit file names to remove leading text以编程方式编辑文件名以删除前导文本
【发布时间】:2018-07-16 20:50:06
【问题描述】:

我在目录中有各种名称如下所示的文件:

first_file_123456.jpg 5 * second_file_246531 (2).jpg

我想做的是着手编写一个 PowerShell 脚本,该脚本可以获取这些文件并像这样重命名它们:

123456.jpg 246531 (2).jpg

我希望去掉最后一个下划线和前面的所有文本以重命名我的文件,以便它们可以匹配我的企业资源规划系统中的项目编号。这个系统更老了(2004 年的技术),所以从那方面自动化已经过时了。

到目前为止,我尝试连接但似乎无法正常工作的内容如下:

    Get-ChildItem -Recurse -filter *_*  | `
    Foreach-Object {
    $oldName = $_.Name
    $pos = $oldName.LastIndexOf("_")
    $newName = $oldName.Substring($pos + 1)
    if (Test-Path $newName) {
        # This is where I get lost - if it runs into a duplicate file name
        # how can I make the name unique
    }        
    #write-host $_.fullname
    write-host $oldName renamed To: $newName | Out-File renamelog.txt
    #rename-item $_.FullName -NewName $newName
}

我注释掉了实际执行某些操作以查看输出的命令。

【问题讨论】:

  • 您尝试过什么,您尝试过什么失败了?理想情况下,您应该提供一个minimal reproducible example 来说明您的尝试,并包含有关它如何失败的具体信息,以及错误消息和/或错误输出。 Stack Overflow 不是代码编写服务;最好的问题是那些提供有用信息的问题,以便回答的人可以指导您设计自己的正确答案。请参阅How to Ask 一个好问题。
  • 话虽如此,我建议您注意-split operator
  • 查看字符串“LastIndexOf”和子字符串

标签: powershell texttrimming


【解决方案1】:

这是一个使用LastIndexOfSubstring 方法的简短演示:

$name = "first_file_123456.jpg"
$indexOfLastUnderscore = $name.LastIndexOf("_")
$newName = $name.Substring($indexOfLastUnderscore + 1, $name.Length - $indexOfLastUnderscore - 1)
# $newName now contains "123456.jpg"

这是使用 PowerShell 的 -split 运算符和数组索引的另一种方式:

$name = "first_file_123456.jpg"
$newName = ($name -split '_')[-1]
$newName
# $newName now contains "123456.jpg"

【讨论】:

    【解决方案2】:

    批量重命名:

    Get-Childitem -path $startDir -recurse |
        where { ! $_.PSIsContainer } |
        foreach { 
            $newName = Join-Path $_.Directory  ($_.Name -replace '.*_', '');
            Rename-Item $_.FullName $newName;
        };
    

    【讨论】:

    • Get-ChildItem -Path $Dir -Recurse -File | Rename-Item -NewName ($_.Name -replace '.*_')
    • @TheIncorrigible1 - 这是假设一个人可以访问 大于 的 PowerShell 版本而不是 2.0,而 没有-file参数.... ;).
    • 当然,但这是 2018 年。现在没有安装更高版本的 WMF 或迁移到 W10/12+ 是不寻常的。
    • @TheIncorrigible1 - 呃,不 - 我在美国为 the largest employer 工作,很抱歉,事实并非如此......
    • 大型组织通常有严格的变更控制流程,需要有充分的理由才能进行系统级变更,所以这并不令人惊讶。
    【解决方案3】:

    枚举您的文件,过滤包含下划线的文件名,然后重命名文件,删除最后一个下划线之前的所有内容。

    $re = '^.*_'
    
    Get-ChildItem 'C:\some\folder' |
        Where-Object { $_.Name -match $re } |
        Rename-Item -NewName { $_.Name -replace $re }
    

    【讨论】:

    • 好的,谢谢 Ansgar 等人。现在,我们如何扩展这个 PS 命令来处理重复的文件名,方法是在名称后面加上一个字母。说文件 123456.jpg 存在,重命名的文件我想命名为 123456 (1).jpg 等等。可行吗?
    • @bbcompent1 请不要移动目标。如果您有新问题或后续问题:发布新问题。但是,以前也有人问过类似的问题,所以请先做一些研究,然后自己尝试一下。
    • 好的,很抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多