使用PowerShell向文件名字符串添加前导零

使用PowerShell向文件名字符串添加前导零,powershell,rename-item-cmdlet,Powershell,Rename Item Cmdlet,我刚开始使用PowerShell,我想知道如何简单地填充几个类似文件名中包含的数字字符串,使每个文件名中的位数相同 也就是说,我有一个包含这300个文件的文件夹: 虚拟名称1.txt通过虚拟名称300.txt 只需将少于3位的文件重命名为全部正好有3位,例如: 虚拟名称001.txt通过虚拟名称300.txt尝试以下操作: Get-ChildItem "c:\temp\" -file -Filter "*.txt" | where basename -match ". \d{1,2}$" | %

我刚开始使用PowerShell,我想知道如何简单地填充几个类似文件名中包含的数字字符串,使每个文件名中的位数相同

也就是说,我有一个包含这300个文件的文件夹:

虚拟名称1.txt
通过
虚拟名称300.txt

只需将少于3位的文件重命名为全部正好有3位,例如:

虚拟名称001.txt
通过
虚拟名称300.txt

尝试以下操作:

Get-ChildItem "c:\temp\" -file -Filter "*.txt" | where basename -match ". \d{1,2}$" | %{
$res=$_.BaseName -split '(.)(\d{1,2})$'
$newnamme="{0}\{1} {2:D3}{3}" -f $_.Directory, $res[0], [int]$res[2], $_.Extension
Rename-Item $_.FullName $newnamme
}
试试这个:

1..300 | %{
     $source = "dummy name $_.txt"
     $target = ('dummy name {0:00#}.txt' -f $_)
     rename-item  $source -NewName $target
     }
注意事项:

  • 外环有点不传统。大多数脚本编写人员将其编码为类似于java for循环

  • 选择单引号和双引号是有意的。小心点

  • 代码有点不雅观,因为文件名的某些部分键入了两次

  • 假设所有300个文件都存在。如果没有,您将得到错误


  • 如果您的文件是按顺序生成的,并且您有
    name1.txt
    name2.txt

    您需要
    name0001.txt
    name0002.txt
    ,等等

    你能行

    $j=1;
    
    foreach ($i in Get-ChildItem "./name?.txt" -Name) {
        echo $i;
        $new_name = "name000" + $j + ".txt";
        Rename-Item -Path $i -NewName $new_name;
        $j=$j+1;
    }
    
    。。。然后再次执行此操作,在开始时将
    $j
    更改为
    10
    ,将
    0
    关闭,以此类推


    好的,一次性的,如果你能首先修复产生文件的原因。

    我会这样做:

    $i=0;
    $nameLike='dummy name'
    [int]$currentid=0
    #RENAME TO REMOVE THE SPACE IN THE MIDDLE
    gci -File -Path "./" | where{ $_.name -like "$nameLike*"} | %{
        #remove space in the middle
        $newname = $_.Name.Split(' ')[0] + $_.Name.Split(' ')[1]
    
        #convert the name into the padding you want (3)
        [int]::TryParse($_.Name.Split(' ')[2].Split('.')[0],[ref]$CurrentId) | Out-Null
        $newname = $newname + $CurrentId.ToString("000") + $_.Extension
        Rename-Item -Path $_.FullName -NewName $newname
    }
    
    详情如下:
    @Tessellingheckler在评论中给出了很好的回答:

    gci | ren -n {[regex]::replace($_.name, '\d+', {"$args".PadLeft(3, '0')})}
    

    gci|ren-n{[regex]::replace($..basename,“\d+”,{“$args.PadLeft(3,'0')})
    我一开始试过这个(显然不起作用):$I=1 Get ChildItem*.txt |%{Rename Item$.-NewName('{0:D3}.txt'-f$I++)}这是一个诱人的重复目标,感谢您的响应。它处理了文件名,但删除了文件扩展名。你知道如何保持文件扩展名不变吗;哎呀。请尝试使用
    $\uu0.Name
    而不是
    $\u0.BaseName