[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理如何给文件名最后的数字改成3位数,不足三位用0补上?

我有多个文件夹,每个文件夹有多个文件,如何给每个文件名最后的数字改成3位数,不足三位用0补上

文件夹名称发几个出来看看有什么规律
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

文件夹都是按数字依次排列的,如1(1),1(2),...2 (1),2 (2),...,文件名英文与数字都有,但是最后几位是数字,从0,1,2,往下排。
例如0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low0
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low1
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2
.每个文件夹下的文件数不超过1000
我希望每个文件夹下的文件按000,001,002, 排列即可

TOP

use strict;

my        @files = glob('*.*');

foreach (@files){
        my $old = $_;
        m/^(.*)\.(.*)$/;
        #print "$1 $2----";
        my $name    =  $1;
        my $postfix =  $2;
       
        $name =~ m/^(.*\D)(\d+)$/;
        #print "$1 $2\n";
        my ($f1 , $f2)  = ($1 , $2);
        ('0000' . $f2) =~ m/(.{3})$/;
        $f2 = $1;
        #print "$f2\n";
        my $new = $f1 . $f2 . '.' . $postfix;
        #print "$new\n";
        rename($old  , $new);
}


#把以上内容拷贝到一个文件 ren.pl
#安装perl  在每一个目录执行这个程序

TOP

回复 4# zuodx


    不管用

TOP

回复 2# Batcher


    文件夹都是按数字依次排列的,如1(1),1(2),...2 (1),2 (2),...,文件名英文与数字都有,但是最后几位是数字,从0,1,2,往下排。
例如0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low0
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low1
0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2
.每个文件夹下的文件数不超过1000
我希望每个文件夹下的文件按000,001,002, 排列即可

TOP

本帖最后由 lifei259 于 2018-10-22 10:33 编辑

没考滤文件的排序,这是DOS的一个短板。
智慧是,利用最简单的代码替代复杂事情的处理过程。
付款请扫头像二维码码,谢谢

TOP

回复 7# lifei259


    你这个不对,没考虑顺序,1后面没接上2,而成了10

TOP

回复 2# Batcher

TOP

回复 9# mofangti

没有后缀的文件不修改,文件名末尾没有数字的不修改。不重新排序。只对后面的数字补全3位数。
  1. @echo off & cd /d "%~dp0" & setlocal EnableDelayedExpansion
  2. for /f "delims=" %%a in ('dir/a-d/b/s *.*') do (
  3. if "%%~xa" neq "" (
  4. call :AAA "%%~na"
  5. if "!ext!" neq "" (
  6. set "ext=0000!ext!"
  7. echo ren "%%a" "!str!!ext:~-3!%%~xa"
  8. )
  9. )
  10. )
  11. pause & exit
  12. :AAA
  13. set "ext="
  14. set "str=%~1"
  15. :LOOP
  16. echo %str:~-1%|findstr "^[0-9]$">nul&&(set "ext=%str:~-1%%ext%" &set "str=%str:~0,-1%"&goto LOOP)|| goto :eof
复制代码
=========================================
上面为演示。实际操作把第7 行 "echo ren" 改为"ren" 即可。

TOP

本帖最后由 WHY 于 2018-10-20 20:28 编辑

test.ps1
  1. dir e:\Test\ -Include *[0-9].* -Recurse | ForEach{
  2.     $name = [regex]::Replace($_.BaseName, '\d{1,3}$', {param($a); $a.Value.PadLeft(3, '0')});
  3.     $name += $_.Extension;
  4.     ren -Literal $_.FullName -NewName $name -WhatIf;
  5. }
复制代码
Microsoft Windows [版本 10.0.17134.345]
(c) 2018 Microsoft Corporation。保留所有权利。

C:\Users\WHY>dir /b /s /a-d E:\Test\
E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc
E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z
E:\Test\a\1.LOG
E:\Test\a\a.txt
E:\Test\a\ccc1.jpg
E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc
E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z

C:\Users\WHY>PowerShell -ExecutionPolicy ByPass -f Desktop\Test.ps1
WhatIf: 正在目标“项: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc 目标: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low008.doc”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z 目标: E:\Test\a\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low002.7z”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\a\1.LOG 目标: E:\Test\a\001.LOG”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\a\ccc1.jpg 目标: E:\Test\a\ccc001.jpg”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low08.doc 目标: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low008.doc”上执行操作“重命名文件”。
WhatIf: 正在目标“项: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low2.7z 目标: E:\Test\b\0b3d9c8b-5a69-49c9-9f8d-a57f5ef0f883_mobile_low002.7z”上执行操作“重命名文件”。

C:\Users\WHY>

TOP

本帖最后由 WHY 于 2018-10-21 17:01 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /L %%i in (0 1 9) do set _%%i=1
  3. for /f "delims=" %%i in ('dir /b /a-d /s E:\Test\*') do (
  4.     set "Name=##%%~ni"
  5.     for /f "tokens=1-3 delims=/" %%n in ("!Name:~-3,1!/!Name:~-2,1!/!Name:~-1!") do (
  6.         if "!_%%n!.!_%%o!.!_%%p!" == ".1.1" (
  7.             echo;ren "%%i" "!Name:~2,-2!0!Name:~-2!%%~xi"
  8.         ) else if "!_%%o!.!_%%p!" == ".1" (
  9.             echo;ren "%%i" "!Name:~2,-1!00!Name:~-1!%%~xi"
  10.         )
  11.     )
  12. )
  13. pause
复制代码
不考虑特殊字符,不考虑重名问题。

TOP

回复 12# WHY

有效,谢谢

TOP

回复 10# xczxczxcz


    有效,谢谢

TOP

回复 11# WHY

TOP

返回列表