Board logo

标题: [文件操作] 【已解决】批处理如何在一堆文件名前面加上序列号? [打印本页]

作者: rockjean    时间: 2021-10-13 21:45     标题: 【已解决】批处理如何在一堆文件名前面加上序列号?

本帖最后由 rockjean 于 2021-10-27 11:01 编辑

现有一堆不规则的文件,大约3000多个,为了规范管理,想以序列号+原文件名的形式,对文件进行重新命名,不知道用批处理怎么才能实现呢?
  比如,原文件名是这样子的 “SMBK4569|彩色瓦楞盒|360×250×170mm|工程图.pdf” ,加上序列号,变成 “RJ001|SMBK4569|彩色瓦楞盒|360×250×170mm|工程图.pdf”  ,
  以此类推,原文件名不变,RJ001开始变化,RJ002,RJ003,如此顺延~
  请问诸位大神,这样的批处理命令该怎么写呢?
作者: Batcher    时间: 2021-10-13 21:51

回复 1# rockjean
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. set n=1000
  5. for /f "tokens=1* delims=|" %%i in ('dir /b /a-d *.pdf') do (
  6.     set /a n+=1
  7.     ren "%%i|%%j" "RJ!n:~1!|%%j"
  8. )
复制代码

作者: rockjean    时间: 2021-10-13 21:52

本帖最后由 rockjean 于 2021-10-13 21:54 编辑

原文件名                                                                       处理后的文件名
8769088|黑白说明书|210×285mm|工程图.pdf     RJ001|8769088|黑白说明书|210×285mm|工程图.pdf
SK9087|海报三折页|280×420mm|工程图.pdf      RJ002|SK9087|海报三折页|280×420mm|工程图.pdf
……
作者: rockjean    时间: 2021-10-13 21:55

回复 2# Batcher


    这么快就有大神出现了,非常感谢,明天上班我试验一下。thank you very much!
作者: dos大帝    时间: 2021-10-14 14:30

对2楼代码的解释:
- 05和07行代码里的 | , ansi或utf8编码下直接运行会报错, 建议将脚本文件用GBK编码, 然后直接用你文件名中的替换
- 代码会将文件“SMBK4569|彩色瓦楞盒|360×250×170mm|工程图.pdf”换成"RJ001|彩色瓦楞盒|360×250×170mm|工程图.pdf”, 第一个|前的字符被替换, 似乎和目的不符
- 代码只针对当前目录的文件, 不包含文件夹, 也不包含子文件夹, 且只针对后缀为pdf的文件
作者: qixiaobin0715    时间: 2021-10-14 14:41

回复 5# dos大帝
此|非彼|也。
作者: dos大帝    时间: 2021-10-14 15:23

回复 6# qixiaobin0715


    就是这个原因会报错, |应该是个表情符, 具体得看楼主
作者: qixiaobin0715    时间: 2021-10-14 15:34

我这里测试没有出错。
你说的后两点是对的。
作者: Batcher    时间: 2021-10-14 17:21

回复 3# rockjean


2楼代码没看清楼主需求,请测试这个代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. set n=1000
  5. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  6.     set /a n+=1
  7.     ren "%%i" "RJ!n:~1!|%%i"
  8. )
复制代码

作者: rockjean    时间: 2021-10-17 16:59

回复 9# Batcher


    现在产生了一个新的需求,因为一天的时间有限,只更新了500多个文件名,剩下的过些日子再更新,如何从501的序号开始更改呢?
作者: Batcher    时间: 2021-10-17 17:05

回复 10# rockjean


9楼代码第4行改成:
set n=1500
作者: aloha20200628    时间: 2021-10-20 13:37

楼主有兴趣可以试试这段代码:
@echo off
set "pathF="
set/p pathF="从资源管理器拖入或键入一个目标目录:"
if not defined pathF exit
set tmpF="_tmpFile_"
dir /s/b/a-d %pathF%\*.txt > %tmpF%
setlocal enabledelayedexpansion
set/a n=0
for /f "usebackq delims=" %%F in (%tmpF%) do (
    set/a n+=1
    set "pf=RJ!n!"
    if !n! lss 10 (set "pf=RJ000!n!") else (if !n! lss 100 (set "pf=RJ00!n!") else (if !n! lss 1000 (set "pf=RJ0!n!")))
    ren "%%F" "!pf!|%%~nxF"
)
del /q %tmpF%
endlocal & exit
作者: aloha20200628    时间: 2021-10-20 13:40

当目录文件上千或更多时,采用dir>临时文件替代for...in ('dir...') 会明显提速。
作者: aloha20200628    时间: 2021-10-20 13:43

抱歉...代码中的.txt应该改成楼主指定的.pdf
作者: aloha20200628    时间: 2021-10-20 17:52

翻了翻以前的笔记,有个更省事的技法来格式化补零字符串,而且有通用性(读者一看即得),用在本例中的代码如下:
    set "pf=RJ000!n!"
    set "pf=!pf:~-4!"
替换我在12楼原来的代码段:
    set "pf=RJ!n!"
    if !n! lss 10 (set "pf=RJ000!n!") else (if !n! lss 100 (set "pf=RJ00!n!") else (if !n! lss 1000 (set "pf=RJ0!n!")))
作者: aloha20200628    时间: 2021-10-20 17:56

抱歉有个笔误,更正如下:
    set "pf=000!n!"
    set "pf=RJ!pf:~-4!"
作者: rockjean    时间: 2021-10-27 10:59

回复 9# Batcher


    经过测试,这个代码可行!非常感谢batcher大神的支持。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2