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

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

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

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

回复 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. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

原文件名                                                                       处理后的文件名
8769088|黑白说明书|210×285mm|工程图.pdf     RJ001|8769088|黑白说明书|210×285mm|工程图.pdf
SK9087|海报三折页|280×420mm|工程图.pdf      RJ002|SK9087|海报三折页|280×420mm|工程图.pdf
……
洛克坚

TOP

回复 2# Batcher


    这么快就有大神出现了,非常感谢,明天上班我试验一下。thank you very much!
洛克坚

TOP

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

TOP

回复 5# dos大帝
此|非彼|也。

TOP

回复 6# qixiaobin0715


    就是这个原因会报错, |应该是个表情符, 具体得看楼主

TOP

我这里测试没有出错。
你说的后两点是对的。

TOP

回复 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. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 9# Batcher


    现在产生了一个新的需求,因为一天的时间有限,只更新了500多个文件名,剩下的过些日子再更新,如何从501的序号开始更改呢?
洛克坚

TOP

回复 10# rockjean


9楼代码第4行改成:
set n=1500
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

楼主有兴趣可以试试这段代码:
@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

TOP

当目录文件上千或更多时,采用dir>临时文件替代for...in ('dir...') 会明显提速。

TOP

抱歉...代码中的.txt应该改成楼主指定的.pdf

TOP

翻了翻以前的笔记,有个更省事的技法来格式化补零字符串,而且有通用性(读者一看即得),用在本例中的代码如下:
    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!")))

TOP

返回列表