标题: [文本处理] [已解决]批处理如何获取文件夹中以数字命名序号最大的txt文本? [打印本页]
作者: hkldd 时间: 2015-7-20 03:45 标题: [已解决]批处理如何获取文件夹中以数字命名序号最大的txt文本?
本帖最后由 pcl_test 于 2016-7-11 10:25 编辑
各位老师;我有很多文件夹中的文档是用数字命名的,我想用批处理把毎个文件夹中数字命名最大的txt文本另存,如以下需求示例;
示例; 在d:\A文件\1.txt、2.txt……59.txt中,59.txt就是命名数字序号最大的文档。
需求; 把59.txt文档复制到d:\B文件\59.txt
度娘半天无果特求助,谢谢大家!
作者: aa77dd@163.com 时间: 2015-7-20 11:12
本帖最后由 aa77dd@163.com 于 2015-7-20 11:14 编辑
- @echo off & setlocal enabledelayedexpansion
- if not exist "BAK\" md "BAK\"
- set "dttm=%date:/=_%%time:~0,2%%time:~3,2%%time:~6,2%"
- md "BAK\%dttm%\"
- for /f "delims=" %%i in ('dir /b /s *.txt^&echo;0') do (
- for %%a in ("%%i\..\..") do if /i "%%~na" neq "BAK" (
- if "%%~spi" neq "!lastdir!" (
- if "!lastdir!!max!" neq "" (
- echo copy "!lastdir!!max!.txt" "BAK\%dttm%\!lastdir:\=_!!max!.txt"
- copy "!lastdir!!max!.txt" "BAK\%dttm%\!lastdir:\=_!!max!.txt"
- )
- set "max=0"
- )
- set /a "t=max-%%~ni>>31, max = t&%%~ni|~t&max"
- set "lastdir=%%~spi"
- )
- )
- pause
复制代码
把批处理文件放在总目录中运行
在总目录中会建立一个 BAK 的目录, 用于存放 备份的文件, 每一次运行 都会在 BAK 下建立一个当前时间命名的新目录, 然后在其中存放备份的文件
为避免备份时重名文件的覆盖问题, 备份的文件都带有一个原始短路径的前缀
作者: hkldd 时间: 2015-7-20 17:43
谢谢![email]aa77dd@163.com[/email]老师,代码比我预期的还好!
作者: bataiping 时间: 2018-8-22 11:33
回复 2# aa77dd@163.com
老师您好,我有个问题解决不了,和这个问题很相似,想请您指点一下。
我有
a1/b1/文件若干.jpg
a2/b2/文件若干.jpg
...
其中,每个文件夹下文件若干,是以数字序号排序的,比如0188,0189,0190这样
这种结构下,想把每个文件夹下的的文件中序号最大的那个文件改名为xxx
请老师指教
作者: Batcher 时间: 2018-8-22 13:14
回复 4# bataiping
执行代码之前注意做好文件备份- @echo off
- setlocal enabledelayedexpansion
- for /d %%a in ("*") do (
- for /d %%b in ("%%a\*") do (
- set "LastFile="
- for /f "delims=" %%c in ('dir /b /a-d "%%b\*.jpg"') do (
- set "LastFile=%%c"
- )
- ren "%%b\!LastFile!" "xxx.jpg"
- )
- )
复制代码
作者: bataiping 时间: 2018-8-22 20:52
回复 5# Batcher
完美的解决了我的问题,向您致谢
作者: bataiping 时间: 2018-8-22 21:10
回复 5# Batcher
感觉看不太懂,没看出来用什么参数排的序
请问,如果想在此基础上,将每个文件夹内其他的文件(不是最大的那些)全部删除,该怎么增加这个命令呢
作者: Batcher 时间: 2018-8-22 21:38
回复 7# bataiping
dir会默认排序的
作者: bataiping 时间: 2018-8-22 23:34
回复 8# Batcher
目的:将每个底层文件夹下的编号最大的tif图片文件名位数+5,并将改动过名称的图像按照原有层级提取到文件夹“更改后”里,写法如下:
@echo off
setlocal enabledelayedexpansion
for /d %%a in ("*") do (
for /d %%b in ("%%a\*") do (
::将LastFile定义为文件中的最大值
set "LastFile="
for /f "delims=" %%c in ('dir /b /a-d "%%b\*.tif"') do (
::使用~n去掉后缀名(便于计算,这里不知道如果没有去掉后缀名可不可以用set /a计算,不过懒得去测试了)
set "LastFile=%%~nc"
)
::将LastFile2定义为文件中的最大值+5
set /a LastFile2=!LastFile!+5
::重命名
ren "%%b\!LastFile!.tif" "!LastFile2!.tif"
::建立临时文件存放文件夹.\更改后
if not exist ".\更改后\%%b\" (md ".\更改后\%%b\")
::复制文件并重命名
copy "%%b\!LastFile2!.tif" ".\更改后\%%b\"!LastFile2!.tif"
)
)
pause
测试了一小批数据似乎没有问题了,但是因为实际操作数据量很大,怕到时候出了问题检查不出来,所以请老师帮我看看代码有没有硬伤
作者: bataiping 时间: 2018-8-22 23:43
其实应该是按照原有层级提取出最后一个文件,再改名+5
这样,提取前的图像命名就没有改变,一定程度上能规避很多误操作带来的错误
作者: Batcher 时间: 2018-8-23 08:29
回复 10# bataiping
那就把copy和ren调整一下先后顺序
作者: Batcher 时间: 2018-8-23 08:31
回复 9# bataiping
set /a LastFile2=!LastFile!+5
这里需要注意几点:
1. 数字不能以0开头,否则会被按照八进制来计算。
2. 数字位数不能太多,否则会超出计算范围。
作者: Batcher 时间: 2018-8-23 08:32
注释推荐使用 rem 尽量少用 ::
作者: bataiping 时间: 2018-8-23 08:36
回复 13# Batcher
那我不知道怎么改了,我的图像名称都是0开头的,0001-0999之间,昨天测试的时候没使用真实数据
请您再给点指导意见。
作者: Batcher 时间: 2018-8-23 09:34
回复 14# bataiping
set /a LastFile2=1!LastFile!+5
ren "%%b\!LastFile!.tif" "!LastFile2:~-4!.tif"
作者: bataiping 时间: 2018-8-23 17:25
回复 15# Batcher
多谢(o^^o)
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |