如何重新编号很多文件?

时间:2019-05-15 13:46:40

标签: powershell powershell-v5.0 rename-item-cmdlet

当前状态

我有一个编号文件列表。这是一个示例(实际上有更多文件)

01 File.sql
02 File.sql
02 another_file.sql
02 a_third_file.sql
03 File.sql
04 File.sql
.....

所需结果

您会看到文件已编号,但是某些文件具有相同的编号。我想做的是遍历所有这些,然后重新编号以使列表看起来像这样:

01 File.sql
02 File.sql
03 another_file.sql
04 a_third_file.sql
05 File.sql
06 File.sql
07 File.sql
.....

我尝试过的

我想出了可以正常使用的Powershell脚本:

$x = 1
Get-ChildItem "*.sql" | Rename-Item -NewName {$_.Name -replace '[0-9][0-9] ', "$x "}

此脚本的作用是遍历所有文件,并删除它们的当前编号,然后将其替换为我在$x中存储的编号。到目前为止,脚本的唯一错误是所有文件的编号均为1,因为我没有在任何地方递增它。

关于实际问题

我可以在脚本的哪个位置递增$x?或者也许我必须以某种方式将其重写为循环,以便能够在每次重命名后增加它?

4 个答案:

答案 0 :(得分:2)

我想说一个简单快捷的方法是:

$x = 0
foreach ( $item in $( Get-ChildItem "PATH" "*.txt" ) ){
    $x++
    Rename-Item $item.fullName -newname $( $item.Name -replace '[0-9][0-9] ', "$x " )
}

这不会执行任何错误检查,因此,如果文件名已存在,则该项目将出错。

如果遇到任何错误,也许要进行两次扫描?或在$ x ++之后插入IF(测试路径...)

*编辑-将$ x更改为0,因此第一个重命名为1

答案 1 :(得分:1)

您可以将foreach与replace和简单的正则表达式一起使用... 另外,如果您想将第一个文件之前的0之前的文件都保留为0,例如01/02/03,直到10,我为此添加了if语句...希望对您有帮助

$i = 1
foreach ($file in Get-ChildItem C:\targetPath) # Change to valid path
{
    if ($i -lt 10) {
    Rename-Item $file.FullName -NewName "0$i $($file.BaseName -replace '^\d+\s').sql"
    }

    else {
    Rename-Item $file.FullName -NewName "$i $($file.BaseName -replace '^\d+\s').sql"
    }
$i++
}

答案 2 :(得分:0)

请注意,您可以使用范围通配符:

 Get-ChildItem '[0-9][0-9] *.sql'

如果您确实想这样做,可以尝试对变量进行范围界定:

 Rename-Item -NewName {$_.Name -replace '[0-9][0-9] ', "$x "; $global:x++} -whatif

在脚本中使用脚本而非全局脚本。

答案 3 :(得分:0)

总结几个技巧:

  • 由于Rename-Item接受流水线式输入,因此无需使用foreach进行迭代。
  • parentheses中的Get-ChildItem放在首位执行,而不会因更改内容而烦恼。
  • 使用wildcard/range选择旧数字
  • 将“正则表达式”替换为用尖号^插入的正则表达式
  • 在插入新数字时,使用-f format operator强制两个位置
  • 使用$script:x / $global:x更新重命名{script block} about_scopes内的变量
    $x = 1
    (Get-ChildItem "[0-9][0-9] *.sql") | 
        Rename-Item -NewName {$_.Name -replace '^\d{2}', ("{0:D2}" -f $global:x++} -WhatIf

如果输出看起来正常,请删除结尾的-WhatIf