Board logo

标题: [代码合集] 求这个重命名文件名的批处理 如何实现文件名更改为文件修改时间 [打印本页]

作者: fyubo    时间: 2012-3-6 13:33     标题: 求这个重命名文件名的批处理 如何实现文件名更改为文件修改时间

@echo off
setlocal enabledelayedexpansion
rem
set "file=jpg,mpg"
for %%i in (!file!) do (
set n=1
for /f "delims=" %%a in ('dir /b "*.%%i"') do (
set "t=%%~ta"
set "t=!t::=:!"
if not exist "!t!%%~xa" (
ren "%%~fa" "!t!%%~xa"
) else (
ren "%%~fa" "!t!_!n!%%~xa"
set /a n=n+1
)
)
)

pause



当前这个批处理只能把文件名命名为2012-03-06 13:28的形式 怎么加上秒 也就是变为2012-03-06 13:28:20这样的格式啊?
还有这个批处理只对当前目录有效 如何针对 子目录也有效呢? 求高手指点
作者: 冷玉公子    时间: 2012-3-6 17:36

set "t=%%~ta"
这句是拿到文件的 日期/时间 文件的修改时间没有秒的

要针对子目录也有效的话改下这句
for /f "delims=" %%a in ('dir /b "*.%%i"') do (
改成
for /f "delims=" %%a in ('dir /s /b "*.%%i"') do (
就是加个/s搜索开关。
/S          显示指定目录和所有子目录中的文件。
作者: fyubo    时间: 2012-3-6 17:58

有的啊 怎么把这个秒也加里面
作者: fyubo    时间: 2012-3-6 18:01

set "t=%%~ta"
这句是拿到文件的 日期/时间 文件的修改时间没有秒的

要针对子目录也有效的话改下这句
...
冷玉公子 发表于 2012-3-6 17:36



    你再帮我看下怎么加上去秒
作者: fyubo    时间: 2012-3-6 19:39

本帖最后由 fyubo 于 2012-3-6 19:47 编辑
set "t=%%~ta"
这句是拿到文件的 日期/时间 文件的修改时间没有秒的

要针对子目录也有效的话改下这句
...
冷玉公子 发表于 2012-3-6 17:36



    还有这个/s参数 当存在文件名更要命名的名字一样的时候 在CMD里面就会出现
存在一个重名文件,或是找不到文件
存在一个重名文件,或是找不到文件
存在一个重名文件,或是找不到文件
存在一个重名文件,或是找不到文件
存在一个重名文件,或是找不到文件
存在一个重名文件,或是找不到文件
.....
当出现这个提示100个之后 程序就不下面走了 这个是什么原因呢 怎么解决呢
作者: apang    时间: 2012-3-6 19:40

wmic可以得到文件修改时间,精确到秒。不过很罗嗦。。。
楼主试试,若可行,删除第10行、11行中的echo。即将echo ren改成ren
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1
  3. for %%i in (jpg,mpg) do (
  4.     for /f "delims=" %%a in ('dir /b /s "*.%%i"') do (
  5.         set "var=%%a"&set "var=!var:\=\\!"
  6.         for /f "tokens=2 delims==" %%b in ('wmic datafile "!var!" get "Last Modified" /value ^|findstr /i "Last"') do (
  7.             set var=%%b
  8.             set "t=!var:~,4!-!var:~4,2!-!var:~6,2! !var:~8,2!:!var:~10,2!:!var:~12,2!"
  9.         )
  10.     if not exist "!t!%%~xa" (echo ren "%%~fa" "!t!%%~xa"
  11.         ) else (echo ren "%%~fa" "!t!_!n!%%~xa"&set /a n=n+1)
  12.     )
  13. )
  14. pause
复制代码

作者: fyubo    时间: 2012-3-6 19:56

本帖最后由 fyubo 于 2012-3-6 20:00 编辑
wmic可以得到文件修改时间,精确到秒。不过很罗嗦。。。
楼主试试,若可行,删除第10行、11行中的echo。即 ...
apang 发表于 2012-3-6 19:40



    wmic 是可以  这个代码是可以实现我的目的 可是运行起来 速度比不调用wmic要慢不知道多少倍了 我上万个文件修改 估计得半天 只看到CMD里面 走的好慢1秒大约2个
而REN基本上是一秒能十个
作者: apang    时间: 2012-3-6 20:11

回复 7# fyubo


    呵呵,你的要求还蛮高哈。
作者: fyubo    时间: 2012-3-6 20:23

回复  fyubo


    呵呵,你的要求还蛮高哈。
apang 发表于 2012-3-6 20:11



是啊 我就是喜欢精益求精   有没有好办法 呵呵
作者: apang    时间: 2012-3-6 20:42

回复 9# fyubo

普通方法好像不行,不信你在CMD窗口输入dir 看有秒显示不;同样%%~ta扩展得到的时间也不会有秒显示。
作者: fyubo    时间: 2012-3-6 20:57

回复  fyubo

普通方法好像不行,不信你在CMD窗口输入dir 看有秒显示不;同样%%~ta扩展得到的时间也不会 ...
apang 发表于 2012-3-6 20:42



   难道这个就是BAT的瓶颈么
作者: powerbat    时间: 2012-3-6 22:06

本帖最后由 powerbat 于 2012-3-6 23:08 编辑
  1. @echo off
  2. set "file=jpg,mpg"
  3. set "fileD=%~d0" & set "fileP=%~p0"
  4. for /f "tokens=1,3* delims=.+ " %%a in ('wmic datafile where "drive='%fileD%' and path='%fileP:\=\\%' and (extension='%file:,=' or extension='%')" get name^,LastModified') do (
  5.     set "t=%%a"
  6.     rem 用for过滤掉wmic结果中的不可见字符
  7.     for /f "delims=" %%i in ("%%c") do (
  8.         setlocal enableDelayedExpansion
  9.         set "t=!t:~,4!-!t:~4,2!-!t:~6,2! !t:~8,2!.!t:~10,2!.!t:~12!"
  10.         for %%t in ("!t!") do (
  11.             endlocal
  12.             if not exist "%%~dpi%%~t%%~xi" (
  13.                 ren "%%~fi" "%%~t%%~xi"
  14.             ) else (
  15.                 set n=1
  16.                 for %%u in ("%%~dpi%%~t_*%%~xi") do set /a n+=1
  17.                 setlocal enableDelayedExpansion
  18.                 for %%u in (!n!) do endlocal& ren "%%~fi" "%%~t_%%~u%%~xi"
  19.             )
  20.         )
  21.     )
  22. )
  23. pause
复制代码

作者: fyubo    时间: 2012-3-6 22:36

无可用范例。
请按任意键继续. . .
powerbat 发表于 2012-3-6 22:06

作者: find    时间: 2012-3-6 22:43

回复 8# apang


VBS调用WMI效率是否会高些?
作者: powerbat    时间: 2012-3-6 22:51

本帖最后由 powerbat 于 2012-3-6 23:06 编辑

回复 13# fyubo


    本机测试后代码有个地方没改到,已更新。
作者: powerbat    时间: 2012-3-6 22:59

回复 14# find


    不是wmic本身的效率问题,而是他的用法不恰当,对每个文件都要调用3个外部命令(for /f内部调用cmd、cmd调用wmic、findstr),你想效率会高吗?
作者: dnfreeuser    时间: 2012-3-7 08:54

c++做了个小程序,把文件拖入(或文件名作为参数),会自动帮你改成修改日期这个名字

time.exe 1.txt
会自动替换成1.txt的修改日期这个名字
作者: apang    时间: 2012-3-7 09:04

回复 16# powerbat


    确实考虑欠周,呵呵。
作者: fyubo    时间: 2012-3-7 09:53

c++做了个小程序,把文件拖入(或文件名作为参数),会自动帮你改成修改日期这个名字


time.exe 1.txt
...
dnfreeuser 发表于 2012-3-7 08:54


哥们
    你这个程序我一打开 就闪一个CMD框子 不见了  需要安装什么控件吗?
作者: fyubo    时间: 2012-3-7 10:03

本帖最后由 fyubo 于 2012-3-7 10:07 编辑
powerbat 发表于 2012-3-6 22:06



    经测试 这个完美高效 就是如果部分文件夹里面存在已经命名过的文件 他会自动在后面加上_1这样的符号 我想让他不加这个 就是命名一致的时候 不要加_1而是直接跳过去  在哪个地方改
if else 后面这个

还有这句
set "file=jpg,avi"怎么把他改为针对所有文件呢 我用了通配符什么的 都不行 BAT不是很懂只是简单的会 汗
作者: dnfreeuser    时间: 2012-3-7 11:32

回复 19# fyubo


    把文件拖入(或文件名作为参数)

说明都不看....
作者: fyubo    时间: 2012-3-7 11:39

本帖最后由 fyubo 于 2012-3-7 11:44 编辑
回复  fyubo


    把文件拖入(或文件名作为参数)

说明都不看....
dnfreeuser 发表于 2012-3-7 11:32



    呵呵 exe 还有这样的用法啊可是怎么把我的文件名的后缀名也给改了呢  哥们再给改下把 保留文件的后缀名
这个还只能一个个的拉 拉进去一个目录 没有效果 把目录名给改了 里面的文件没有变化
作者: dnfreeuser    时间: 2012-3-7 13:14

回复 22# fyubo


这个是配合你批处理用的,不是要用批处理嘛,所做的就一个操作,把参数指定的文件名改为文件修改时间

其他统统不管,枚举文件什么的,都要你批处理做(都放exe里了,你要批处理干嘛呢?你说是吧?)
修改了会删掉扩展名的BUG和文件时间为标准时间的BUG,用法如下:
  1. @echo off
  2. for /r %%i in (*.jpg,*.mpg) do time.exe "%%i"
  3. pause
复制代码

作者: fyubo    时间: 2012-3-7 17:25

回复  fyubo


   

这个是配合你批处理用的,不是要用批处理嘛,所做的就一个操作,把参数指定的文 ...
dnfreeuser 发表于 2012-3-7 13:14



    经测试  这个效果刚刚的  谢谢拉
作者: powerbat    时间: 2012-3-7 19:42

回复 20# fyubo
  1. @echo off
  2. set "file=jpg,mpg"
  3. set "Ext=*.%file:,= *.%"
  4. rem 先重命名一次,加一段文件名中不会出现的字符串,防止可能的文件名重复问题。
  5. for /f "delims=" %%a in ('dir /b %Ext%') do (
  6.     ren "%%~fa" "powerbat@bathome_%%~nxa"
  7. )
  8. set "FileD=%~d0" & set "FileP=%~p0"
  9. set "Ext=and (extension='%file:,=' or extension='%')"
  10. set "Filter=drive='%FileD%' and path='%FileP:\=\\%' %Ext%"
  11. for /f "tokens=1,3* delims=.+ " %%a in ('wmic datafile where "%Filter%" get name^,LastModified') do (
  12.     set "t=%%a"
  13.     rem 用for过滤掉wmic结果中的不可见字符
  14.     for /f "delims=" %%i in ("%%c") do (
  15.         set "f=%%~fi"
  16.         set "p=%%~dpi"
  17.         set "n=%%~ni"
  18.         set "x=%%~xi"
  19.         setlocal enableDelayedExpansion
  20.         set "t=!t:~,4!-!t:~4,2!-!t:~6,2! !t:~8,2!.!t:~10,2!.!t:~12!"
  21.         if not exist "!p!!t!!x!" (
  22.             ren "!f!" "!t!!x!"
  23.         ) else  if "!t!" neq "!n!" (
  24.             set n=1
  25.             for %%u in ("!p!!t!_*!x!") do set /a n+=1
  26.             ren "!f!" "!t!_!n!!x!"
  27.         )
  28.         endlocal
  29.     )
  30. )
  31. pause
复制代码

作者: fyubo    时间: 2012-3-7 22:21

回复  fyubo
powerbat 发表于 2012-3-7 19:42



    如果要想对子目录也有效呢 烦请你再改下吧
作者: powerbat    时间: 2012-3-7 22:40

批处理将文件重命名为文件修改时间(精确到秒)
http://www.bathome.net/thread-15792-1-1.html
作者: fyubo    时间: 2012-3-8 00:06

批处理将文件重命名为文件修改时间(精确到秒)
powerbat 发表于 2012-3-7 22:40



    错误:
代码 = 0x80020009
说明 = 发生意外。
设备 = Dispatch
请按任意键继续. . .

文件夹里面 数量有几千个的时候 这个是不是内存溢出了?
作者: powerbat    时间: 2012-3-8 18:54

本帖最后由 powerbat 于 2012-3-8 20:12 编辑

回复 28# fyubo

是有可能wmic分配的内存不够用了。
看来wmic也太矬了。。。
vbs版
http://www.bathome.net/thread-15803-1-1.html




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2