标题: [文件操作] 批处理调整文件名,目录下所有文件的名字按照4,1,2,3的顺序进行更改,并以此类推 [打印本页]
作者: 001011 时间: 2023-2-28 21:57 标题: 批处理调整文件名,目录下所有文件的名字按照4,1,2,3的顺序进行更改,并以此类推
求助高手
有N个文件夹,每个文件夹里面有很多张JPG格式的图片文件,需要将第一个文件命名为0004、第二个文件命名为0001、第三个文件命名为0002、第四个文件命名为0003,第五个文件命名为0008、第六个文件命名为0005、第七个文件命名为0006、第八个文件命名为0007、第九个文件命名为0012,依此类推 请用批处理编写
说明:一个A3的纸 有四面 扫描后 第4页和第1页在一起 第2页和第3页在一起 分割开后的顺序就是 第一文件是第4页 第二个文件是第1页 第三个文件是第2页 第二个文件是第3页
做这个程序的目的是把顺序调整正确
示例:
原文件名 命名后
1 4
2 1
3 2
4 3
5 8
6 5
7 6
8 7
9 12
10 9
11 10
12 11
13 16
. .
. .
. .
. .
. .
感谢 感谢
作者: jyswjjgdwtdtj 时间: 2023-2-28 22:09
不是你这有啥规律啊
作者: 001011 时间: 2023-2-28 22:12
回复 2# jyswjjgdwtdtj
一个A3的纸 有四面 扫描后 第4页和第1页在一起 第2页和第3页在一起 分割开后的顺序就是 第一文件是第4页 第二个文件是第1页 第三个文件是第2页 第二个文件是第3页
做这个程序的目的是把顺序调整正确
作者: 001011 时间: 2023-2-28 22:16
ChatGPT写的代码:
@echo off
setlocal EnableDelayedExpansion
set /a i=0
for %%f in (*.jpg) do (
set /a i+=1
if !i! == 1 (
ren "%%f" "0004.jpg"
) else if !i! == 2 (
ren "%%f" "0001.jpg"
) else if !i! == 3 (
ren "%%f" "0002.jpg"
) else if !i! == 4 (
ren "%%f" "0003.jpg"
)
)
echo All files have been renamed.
作者: 77七 时间: 2023-2-28 23:10
- @echo off
- rem 假设每个文件夹内图片数量均不超过100
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /ad') do (
- pushd "%%i"
- for /l %%l in (1,1,100) do (
- if exist %%l.jpg (
- set /a "m=(%%l+4)%%4"
- if "!m!" equ "1" (
- set /a n=%%l+3
- ) else (
- set /a n=%%l-1
- )
- ren %%l.jpg !n!.jpg1
- )
- )
- ren *.jpg1 *.jpg
- popd
- )
- endlocal
- pause
复制代码
这样行吗?使用前先备份
作者: 001011 时间: 2023-2-28 23:33
回复 5# 77七
运行了 没有反应啊
文件夹内的文件不止100个 1000个以内
作者: buyiyang 时间: 2023-3-1 00:21
本帖最后由 buyiyang 于 2023-3-1 00:26 编辑
回复 6# 001011
试试这个,先备份测试- setlocal enabledelayedexpansion
- for /d %%i in (*) do (
- pushd "%%i"
- set /a n=10000
- for %%a in (*.jpg) do (
- set /a n+=1
- set /a m=n%%4
- if !m! equ 1 (set /a s=n+3) else (
- set /a s=n-1
- )
- ren "%%a" "!s:~1!.jpg"
- )
- popd
- )
- pause
复制代码
作者: 77七 时间: 2023-3-1 00:31
回复 6# 001011
我知道问题了,是0001 不是1- @echo off
- rem 假设每个文件夹内图片数量均不超过1000
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /ad') do (
- pushd "%%i"
- for /l %%l in (1,1,1000) do (
- set k=000%%l
- set k=!k:~-4!
- if exist !k!.jpg (
- set /a "m=(%%l+4)%%4"
- if "!m!" equ "1" (
- set /a "n=%%l+3"
- ) else (
- set /a "n=%%l-1"
- )
- set n=000!n!
- echo ren !k!.jpg !n:~-4!.jpg1
- ren "!k!.jpg" "!n:~-4!.jpg1"
- )
- )
- ren *.jpg1 *.jpg
- popd
- )
- endlocal
- pause
复制代码
再试试
作者: qixiaobin0715 时间: 2023-3-1 09:02
本帖最后由 qixiaobin0715 于 2023-3-2 08:10 编辑
- @echo off
- set /a #1=3,#2=#3=#0=-1
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /s /a-d *.jpg') do (
- set /a n=%%~ni%%4
- set /a m=%%~ni+#!n!
- set m=000!m!
- ren "%%i" "!m:~-4!%%~xi"
- )
- pause
复制代码
作者: 001011 时间: 2023-3-1 10:29
回复 9# qixiaobin0715
运行没有效果 不过还是感谢
作者: 77七 时间: 2023-3-1 10:50
借鉴下7楼和9楼两位大佬的写法,综合一下- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /s /a-d *.jpg') do (
- for /f "tokens=* delims=0" %%b in ("%%~na") do (
- set /a "p=%%b%%4"
- if !p! equ 1 (
- set /a "n=10000+%%b+3"
- ) else (
- set /a "n=10000+%%b-1"
- )
- ren "%%a" !n:~-4!.jpg1
- )
- )
- )
- endlocal
- for /r %%a in (*.jpg1) do (
- ren "%%a" "%%~na.jpg"
- )
- pause
复制代码
作者: 77七 时间: 2023-3-1 11:07
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /s /a-d *.jpg') do (
- set "m=1%%~na"
- set /a "p=!m!%%4"
- if !p! equ 1 (
- set /a "n=!m!+3"
- ) else (
- set /a "n=!m!-1"
- )
- ren "%%a" !n:~-4!.jpg1
- )
- endlocal
- for /r %%a in (*.jpg1) do (
- ren "%%a" "%%~na.jpg"
- )
- pause
复制代码
不去0了,前面添加一个1
作者: qixiaobin0715 时间: 2023-3-1 11:17
回复 10# 001011
仔细看了看,原来如此。顶楼表达有问题,这样就不会使人误会了:
原文件名 命名后
0001 00004
0002 00001
0003 00002
0004 00003
0005 00008
0006 00005
....
重命名后,前面多加一个0,防止命名过程中出现重名文件,我想应当不会有大碍。
代码中使用了伪循环(第2个for),作用是去掉原文件名中的位于最前面的若干0,便于后面的计算:- @echo off
- set /a #1=3,#2=#3=#0=-1
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /s /a-d *.jpg') do (
- for /f "tokens=* delims=0" %%j in ("%%~ni") do (
- set /a n=%%j%%4
- set /a m=%%j+#!n!
- set m=0000!m!
- ren "%%i" "!m:~-5!%%~xi"
- )
- )
- pause
复制代码
作者: newswan 时间: 2023-3-1 11:35
- @echo off
- setlocal EnableDelayedExpansion
-
- for /l %%a in (1,1,10) do (
- call :c %%a
- )
-
- pause
- exit
-
- :c
- set/a n1=%1
- set/a r = %1 %% 4
- if %r% equ 1 (
- set /a n2 = n1 + 3
- ) else (
- set /a n2 = n1 - 1
- )
- set n1 = 0000%n1%
- set n2 = 0000%n2%
- set n1 = %n1:~4%
- set n2 = %n2:~4%
- echo %n1% n%n2%
-
- goto :eof
复制代码
原文件名是什么样的?
如果前后文件名都是相同位数,会出现同名情况,怎么处理?
作者: aloha20200628 时间: 2023-3-1 14:11
LZ引诸位玩了一把f(4n)的函数游戏,
但若对图片内容与更名序号的对应关系无所谓,
其实与按自然数序号更名后的结果并无实质区别
因为系统自动排序后就又重归自然数队形了...
更名结果 系统自动打回原形
0004.jpg 0001.jpg
0001.jpg 0002.jpg
0002.jpg 0003.jpg
0003.jpg 0004.jpg
0008.jpg 0005.jpg
0005.jpg 0006.jpg
0006.jpg 0007.jpg
0007.jpg 0008.jpg
作者: Batcher 时间: 2023-3-1 14:43
回复 1# 001011
建议下次发帖的时候放个截图,让大家看看真实的文件名。否则编出来的文件名可能导致别人浪费时间写成不符合实际需求的代码。
作者: Batcher 时间: 2023-3-1 14:44
回复 15# aloha20200628
根据楼主的描述,图片内容与更名序号的对应关系有所谓。
作者: 001011 时间: 2023-3-1 20:56
回复 16# Batcher
好的 好的
作者: 001011 时间: 2023-3-1 21:01
回复 14# newswan
抱歉 没有说清楚 原文件名(0001)和更改后的文件名一致 也可以不一致(避免重复文件名)
作者: newswan 时间: 2023-3-1 23:12
回复 19# 001011 - @echo off
- setlocal EnableDelayedExpansion
-
-
- for %%a in ( work\*.jpg ) do (
- call :c %%a
- )
-
- pause
- exit/b
-
- :c
- set n1=%~n1
- set/a r=%n1% %% 4
- if %r% equ 1 (
- set /a n2 = n1 + 3
- ) else (
- set /a n2 = n1 - 1
- )
- set n2=0000%n2%
- set n2=%n2:~-4%
- echo work\%n1%%~x1 work\n%2%%~x1
- goto :eof
复制代码
修改 "echo work\..." 为 copy 或者 move
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |