找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 64724|回复: 16

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

[复制链接]
发表于 2021-10-13 21:45:52 | 显示全部楼层 |阅读模式
本帖最后由 rockjean 于 2021-10-27 11:01 编辑

现有一堆不规则的文件,大约3000多个,为了规范管理,想以序列号+原文件名的形式,对文件进行重新命名,不知道用批处理怎么才能实现呢?
  比如,原文件名是这样子的 “SMBK4569|彩色瓦楞盒|360×250×170mm|工程图.pdf” ,加上序列号,变成 “RJ001|SMBK4569|彩色瓦楞盒|360×250×170mm|工程图.pdf”  ,
  以此类推,原文件名不变,RJ001开始变化,RJ002,RJ003,如此顺延~
  请问诸位大神,这样的批处理命令该怎么写呢?
发表于 2021-10-13 21:51:13 | 显示全部楼层
回复 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. )
复制代码
 楼主| 发表于 2021-10-13 21:52:00 | 显示全部楼层
本帖最后由 rockjean 于 2021-10-13 21:54 编辑

原文件名                                                                       处理后的文件名
8769088|黑白说明书|210×285mm|工程图.pdf     RJ001|8769088|黑白说明书|210×285mm|工程图.pdf
SK9087|海报三折页|280×420mm|工程图.pdf      RJ002|SK9087|海报三折页|280×420mm|工程图.pdf
……
 楼主| 发表于 2021-10-13 21:55:48 | 显示全部楼层
回复 2# Batcher


    这么快就有大神出现了,非常感谢,明天上班我试验一下。thank you very much!
发表于 2021-10-14 14:30:42 | 显示全部楼层
对2楼代码的解释:
- 05和07行代码里的 | , ansi或utf8编码下直接运行会报错, 建议将脚本文件用GBK编码, 然后直接用你文件名中的替换
- 代码会将文件“SMBK4569|彩色瓦楞盒|360×250×170mm|工程图.pdf”换成"RJ001|彩色瓦楞盒|360×250×170mm|工程图.pdf”, 第一个|前的字符被替换, 似乎和目的不符
- 代码只针对当前目录的文件, 不包含文件夹, 也不包含子文件夹, 且只针对后缀为pdf的文件
发表于 2021-10-14 14:41:28 | 显示全部楼层
回复 5# dos大帝
此|非彼|也。
发表于 2021-10-14 15:23:16 | 显示全部楼层
回复 6# qixiaobin0715


    就是这个原因会报错, |应该是个表情符, 具体得看楼主
发表于 2021-10-14 15:34:27 | 显示全部楼层
我这里测试没有出错。
你说的后两点是对的。
发表于 2021-10-14 17:21:41 | 显示全部楼层
回复 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. )
复制代码
 楼主| 发表于 2021-10-17 16:59:30 | 显示全部楼层
回复 9# Batcher


    现在产生了一个新的需求,因为一天的时间有限,只更新了500多个文件名,剩下的过些日子再更新,如何从501的序号开始更改呢?
发表于 2021-10-17 17:05:55 | 显示全部楼层
回复 10# rockjean


9楼代码第4行改成:
set n=1500
发表于 2021-10-20 13:37:11 | 显示全部楼层
楼主有兴趣可以试试这段代码:
@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
发表于 2021-10-20 13:40:47 | 显示全部楼层
当目录文件上千或更多时,采用dir>临时文件替代for...in ('dir...') 会明显提速。
发表于 2021-10-20 13:43:05 | 显示全部楼层
抱歉...代码中的.txt应该改成楼主指定的.pdf
发表于 2021-10-20 17:52:04 | 显示全部楼层
翻了翻以前的笔记,有个更省事的技法来格式化补零字符串,而且有通用性(读者一看即得),用在本例中的代码如下:
    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!")))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 04:32 , Processed in 0.032443 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表