标题: [文件操作] 批处理如何给文件名最后的数字改成3位数,不足三位用0补上? [打印本页]
作者: mofangti 时间: 2018-10-15 08:34 标题: 批处理如何给文件名最后的数字改成3位数,不足三位用0补上?
我有多个文件夹,每个文件夹有多个文件,如何给每个文件名最后的数字改成3位数,不足三位用0补上
作者: Batcher 时间: 2018-10-15 09:00
文件夹名称发几个出来看看有什么规律
作者: mofangti 时间: 2018-10-17 11:10
文件夹都是按数字依次排列的,如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, 排列即可
作者: zuodx 时间: 2018-10-17 13:35
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 在每一个目录执行这个程序
作者: mofangti 时间: 2018-10-17 14:40
回复 4# zuodx
不管用
作者: mofangti 时间: 2018-10-19 09:10
回复 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, 排列即可
作者: lifei259 时间: 2018-10-19 10:00
本帖最后由 lifei259 于 2018-10-22 10:33 编辑
没考滤文件的排序,这是DOS的一个短板。
作者: mofangti 时间: 2018-10-19 16:23
回复 7# lifei259
你这个不对,没考虑顺序,1后面没接上2,而成了10
作者: mofangti 时间: 2018-10-19 16:27
回复 2# Batcher
作者: xczxczxcz 时间: 2018-10-19 19:24
回复 9# mofangti
没有后缀的文件不修改,文件名末尾没有数字的不修改。不重新排序。只对后面的数字补全3位数。- @echo off & cd /d "%~dp0" & setlocal EnableDelayedExpansion
- for /f "delims=" %%a in ('dir/a-d/b/s *.*') do (
- if "%%~xa" neq "" (
- call :AAA "%%~na"
- if "!ext!" neq "" (
- set "ext=0000!ext!"
- echo ren "%%a" "!str!!ext:~-3!%%~xa"
- )
- )
- )
- pause & exit
- :AAA
- set "ext="
- set "str=%~1"
- :LOOP
- 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" 即可。
作者: WHY 时间: 2018-10-19 20:15
本帖最后由 WHY 于 2018-10-20 20:28 编辑
test.ps1- dir e:\Test\ -Include *[0-9].* -Recurse | ForEach{
- $name = [regex]::Replace($_.BaseName, '\d{1,3}$', {param($a); $a.Value.PadLeft(3, '0')});
- $name += $_.Extension;
- ren -Literal $_.FullName -NewName $name -WhatIf;
- }
复制代码
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>
作者: WHY 时间: 2018-10-20 20:30
本帖最后由 WHY 于 2018-10-21 17:01 编辑
- @echo off & setlocal enabledelayedexpansion
- for /L %%i in (0 1 9) do set _%%i=1
- for /f "delims=" %%i in ('dir /b /a-d /s E:\Test\*') do (
- set "Name=##%%~ni"
- for /f "tokens=1-3 delims=/" %%n in ("!Name:~-3,1!/!Name:~-2,1!/!Name:~-1!") do (
- if "!_%%n!.!_%%o!.!_%%p!" == ".1.1" (
- echo;ren "%%i" "!Name:~2,-2!0!Name:~-2!%%~xi"
- ) else if "!_%%o!.!_%%p!" == ".1" (
- echo;ren "%%i" "!Name:~2,-1!00!Name:~-1!%%~xi"
- )
- )
- )
- pause
复制代码
不考虑特殊字符,不考虑重名问题。
作者: mofangti 时间: 2018-10-22 09:00
回复 12# WHY
有效,谢谢
作者: mofangti 时间: 2018-10-22 09:00
回复 10# xczxczxcz
有效,谢谢
作者: mofangti 时间: 2018-10-22 09:45
回复 11# WHY
作者: WHY 时间: 2018-10-22 11:03
回复 15# mofangti
powershell 2.0版本中 rename-Item 不支持 -literalPath 参数,你可以改成 -Path,或者更新 PowerShell 版本。
作者: mofangti 时间: 2018-10-23 18:18
回复 16# WHY
怎么文件没有变化?
作者: Batcher 时间: 2018-10-23 21:27
回复 17# mofangti
把-WhatIf去掉
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |