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

[文件操作] 【已解决】BAT脚本如何批量重命名文件时带上文件夹名称?

本帖最后由 xzwcn 于 2020-6-13 11:18 编辑

文件列表结构示例如下:

├─2013
│  ├─2013-07-08
│  │      .nomedia
│  │
│  ├─2013-07-09
│  │      .nomedia
│  │
│  ├─2013-07-10
│  │      .nomedia
│  │      2013-07-10_call_15-59-28_OUT_371xx5.AMR
│  │      call_18-02-48_OUT_6xx3.AMR
│  │      call_18-05-22_IN_64xx43.AMR
│  │
│  ├─2013-07-17
│  │      .nomedia
│  │
│  ├─2013-07-18
│  │      .nomedia
│  │      call_12-29-35_OUT_1353xxx0711.AMR
│  │      call_21-00-55_IN_64xx30.AMR
│  │
│  ├─2013-07-22
│  │      .nomedia
│  │      call_13-55-24_IN_未知.AMR
│  │
│  ├─2013-07-23
│  │      .nomedia
│  │      call_21-35-49_IN_13xx774.AMR

要实现文件名增加前缀(取所在目录的文件名),如上面的文件:
call_18-02-48_OUT_6xx3.AMR 变成 : 2013-07-10_call_18-02-48_OUT_6xx3.AMR

回复 8# xzwcn
  1. @echo off
  2. for /r %%i in ("*") do (
  3. if not "%%~i"=="%~0" (
  4. set "t=%%~ti"
  5. call set "t=%%t:/=-%%"
  6. call set "t=%%t:\=-%%"
  7. call set "t=%%t::=.%%"
  8. call echo rename "%%i" "%%t%%_%%~nxi"
  9. )
  10. )
  11. pause&exit
复制代码

TOP

本帖最后由 xzwcn 于 2020-6-14 10:06 编辑

回复 7# went

不好意思,我表达者不够清晰,我要修改是文件名称,不是文件夹的,这个执行之后,文件夹名称变成了最后修改时间的。
例如我的文件结构如下:(执行dir的结果)
Mode            LastWriteTime                    Length                     Name
----                -------------                           ------                       ----
-a----            2018/10/1 周一     17:56      93621                   10月1日 17点56分.mp3
-a----            2018/10/20 周六   10:04   1429001                  10月20日 10点02分.mp3

我希望变成:
Mode            LastWriteTime                    Length                     Name
----                -------------                           ------                       ----
-a----            2020/06/14 周日 10:06      93621                   2018-10-01 周一 17:56_10月1日 17点56分.mp3
-a----            2020/06/14 周日 10:06  1429001                  2018-10-20 周六 10:04_10月20日 10点02分.mp3

周几是系统设置的时间格式,可以和这个不一样,只要是按修改时间添加到原文件名称前面的就可以。

TOP

回复 6# xzwcn
确认无误,去掉echo,放到2013文件夹下,只处理一级文件夹
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /d %%i in ("*") do (
  4. set "times="
  5. for %%a in ("%%i\*") do set "times=%%~ta"
  6. if not "!times!"=="" (
  7. set "times=!times: =_!"
  8. set "times=!times:-=!"
  9. set "times=!times:/=!"
  10. set "times=!times::= !"
  11. echo rename "%%i" "!times!"
  12. )
  13. )
  14. pause&exit
复制代码

TOP

回复 5# went

只按文件最后修改时间(貌似我应该另外发个帖子

TOP

回复 4# xzwcn
要看你是先改文件名还是先改文件夹名,顺序不一样,结果可能不一样

TOP

回复 2# went
你好,另外想请教一下,如果把文件夹名称改为文件修改时间,变量要如何调整?(:不能做为文件名的一部分,用空代替,如文件修改时间为:2020-06-12 16:34 ,改成:20200612_16:34)

TOP

回复 2# went


另外一个思路
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /s /a-d *.AMR') do (
  4.     for %%j in ("%%i\..") do (
  5.         ren "%%i" "%%~nxj_%%~nxi"
  6.     )
  7. )
复制代码
1

评分人数

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

TOP

放到你的2013文件夹下,确认没有问题就把echo去掉
  1. @echo off
  2. for /r /d %%i in ("*") do (
  3. for %%a in ("%%i\*") do (
  4. echo rename "%%a " "%%~nxi_%%~nxa"
  5. )
  6. )
  7. pause&exit
复制代码
1

评分人数

    • xzwcn: 感谢分享技术 + 1

TOP

返回列表