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

[文本处理] [已解决]批处理如何获取文件夹中以数字命名序号最大的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: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 下建立一个当前时间命名的新目录, 然后在其中存放备份的文件
为避免备份时重名文件的覆盖问题,  备份的文件都带有一个原始短路径的前缀

TOP

谢谢![email]aa77dd@163.com[/email]老师,代码比我预期的还好!

TOP

回复 2# aa77dd@163.com


    老师您好,我有个问题解决不了,和这个问题很相似,想请您指点一下。

我有
a1/b1/文件若干.jpg
a2/b2/文件若干.jpg
...
其中,每个文件夹下文件若干,是以数字序号排序的,比如0188,0189,0190这样

这种结构下,想把每个文件夹下的的文件中序号最大的那个文件改名为xxx

请老师指教

TOP

回复 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. )
复制代码
1

评分人数

    • CrLf: 十年如一日,站长辛苦了技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 5# Batcher

完美的解决了我的问题,向您致谢

TOP

回复 5# Batcher

感觉看不太懂,没看出来用什么参数排的序

请问,如果想在此基础上,将每个文件夹内其他的文件(不是最大的那些)全部删除,该怎么增加这个命令呢

TOP

回复 7# bataiping


    dir会默认排序的
1

评分人数

    • CrLf: 十年如一日,站长辛苦了技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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


测试了一小批数据似乎没有问题了,但是因为实际操作数据量很大,怕到时候出了问题检查不出来,所以请老师帮我看看代码有没有硬伤

TOP

其实应该是按照原有层级提取出最后一个文件,再改名+5

这样,提取前的图像命名就没有改变,一定程度上能规避很多误操作带来的错误

TOP

回复 10# bataiping


    那就把copy和ren调整一下先后顺序
1

评分人数

    • CrLf: 十年如一日,站长辛苦了技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 9# bataiping


set /a LastFile2=!LastFile!+5
这里需要注意几点:
1. 数字不能以0开头,否则会被按照八进制来计算。
2. 数字位数不能太多,否则会超出计算范围。
1

评分人数

    • CrLf: 十年如一日,站长辛苦了技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

注释推荐使用 rem 尽量少用 ::
1

评分人数

    • CrLf: 十年如一日,站长辛苦了技术 + 1
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 13# Batcher

那我不知道怎么改了,我的图像名称都是0开头的,0001-0999之间,昨天测试的时候没使用真实数据

请您再给点指导意见。

TOP

回复 14# bataiping


set /a LastFile2=1!LastFile!+5
ren "%%b\!LastFile!.tif" "!LastFile2:~-4!.tif"
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表