以编程方式编辑文件名以删除前导文本

时间:2018-02-06 17:46:02

标签: powershell texttrimming

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

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
}

我注释掉了实际做某事的命令,看看输出是什么。

3 个答案:

答案 0 :(得分:2)

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

$re = '^.*_'

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

答案 1 :(得分: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 :(得分:1)

批量重命名:

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