Board logo

标题: [文本处理] [已解决]批处理如何获取文件夹中以数字命名序号最大的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 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. if not exist "BAK\" md "BAK\"
  3. set "dttm=%date:/=_%%time:~0,2%%time:~3,2%%time:~6,2%"
  4. md "BAK\%dttm%\"
  5. for /f "delims=" %%i in ('dir /b /s *.txt^&echo;0') do (
  6.     for %%a in ("%%i\..\..") do if /i "%%~na" neq "BAK" (
  7.         if "%%~spi" neq "!lastdir!" (
  8.             if "!lastdir!!max!" neq "" (
  9.                 echo copy "!lastdir!!max!.txt" "BAK\%dttm%\!lastdir:\=_!!max!.txt"
  10.                 copy "!lastdir!!max!.txt" "BAK\%dttm%\!lastdir:\=_!!max!.txt"
  11.             )
  12.             set "max=0"
  13.         )
  14.         set /a "t=max-%%~ni>>31, max = t&%%~ni|~t&max"
  15.         set "lastdir=%%~spi"
  16.     )
  17. )
  18. 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


执行代码之前注意做好文件备份
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /d %%a in ("*") do (
  4.     for /d %%b in ("%%a\*") do (
  5.         set "LastFile="
  6.         for /f "delims=" %%c in ('dir /b /a-d "%%b\*.jpg"') do (
  7.             set "LastFile=%%c"
  8.         )
  9.         ren "%%b\!LastFile!" "xxx.jpg"
  10.     )
  11. )
复制代码

作者: 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