Board logo

标题: [文件操作] 批处理如何自动按文件夹名称批量重命名各自的文件? [打印本页]

作者: gan537519    时间: 2024-7-30 23:05     标题: 批处理如何自动按文件夹名称批量重命名各自的文件?

本帖最后由 gan537519 于 2024-8-2 23:56 编辑

比如现在文件夹A,A里面有文件夹photo, document,  data,  other. 各个文件夹内有若干个文件。
那么在A里面双击bat后
photo里面的所有文件都加上前缀 picture
document里面的全部文件加上前缀 TX
data里面的全部文件加上前缀data
other的不处理。

包含当前目录和所有子目录下的文件都是这样处理。
作者: 77七    时间: 2024-7-31 00:07

  1. @echo off
  2. cd /d "%~dp0"
  3. for %%a in ("_photo=picture" "_document=TX" "_data=data") do (
  4. set %%~a
  5. )
  6. for /f "delims=" %%d in ('dir /b /ad') do (
  7. if defined _%%d (
  8. for /f "delims=" %%i in ('dir /b /s /a-d "%%d\*"') do (
  9. call ren "%%i" "%%_%%d%%%%~nxi"
  10. )
  11. )
  12. )
  13. pause
复制代码

自行测试...
作者: aloha20200628    时间: 2024-7-31 13:21

本帖最后由 aloha20200628 于 2024-8-3 08:45 编辑

回复 1# gan537519

给一个不用自定义变量%var%的版本...
  1. @echo off &for %%d in (
  2. "photo/picture"
  3. "document/TX"
  4. "data/data"
  5. ) do for /f "tokens=1-2 delims=/" %%a in ("%%~d") do (
  6. pushd "%%a"
  7. for /f "delims=" %%F in ('dir /b/a-d') do ren "%%F" "%%b_%%~nxF"
  8. popd
  9. )
  10. pause&exit/b
复制代码

作者: gan537519    时间: 2024-8-2 22:07

回复  gan537519

给一个不用自定义变量%var%的版本...
aloha20200628 发表于 2024-7-31 13:21


谢谢。当前目录下的可以,子目录下文件的不行。大佬看下能不能帮忙弄下在子目录也自动执行这些规则,比如photo 文件夹里面还有文件夹photo,第二个photo里的文件也自动重命名。other里面有document,这个document里的文件也自动重命名。
作者: gan537519    时间: 2024-8-2 22:22

自行测试...
77七 发表于 2024-7-31 00:07



    谢谢。当前目录下的可以,子目录下的文件也自动按照根目录的执行,比如data里面有photo,photo的文件还是按data命名了。
大佬看下能不能帮忙弄下在子目录下的文件也自动按分类执行这些规则,比如data文件夹里面还有文件夹photo,这个photo里的文件自动重命名为picture。other里面有document,这个document里的文件也自动重命名TX。
作者: 77七    时间: 2024-8-2 22:40

回复 5# gan537519


  
包含当前目录和所有子目录下的文件都是这样处理。
描述为 包含当前目录和所有子目录下的文件都是这样处理。是不是更为恰当?
  1. @echo off
  2. cd /d "%~dp0"
  3. for %%a in ("_photo=picture" "_document=TX" "_data=data") do (
  4. set %%~a
  5. )
  6. for /f "delims=" %%d in ('dir /b /s /ad') do (
  7. if defined _%%~nxd (
  8. for /f "delims=" %%i in ('dir /b /a-d "%%d\*"') do (
  9. call ren "%%d\%%i" "%%_%%~nxd%%%%~nxi"
  10. )
  11. )
  12. )
  13. pause
复制代码


未测试。
作者: gan537519    时间: 2024-8-2 23:52

回复 6# 77七


    谢谢,测试可行。抱歉描述的不够准确。
作者: gan537519    时间: 2024-8-3 00:51

回复 6# 77七


    对了,前缀后应该有个"_", 但没有出来
作者: 77七    时间: 2024-8-3 01:13

回复 8# gan537519


   %%~nxi指文件名,在前面加上就行。
作者: aloha20200628    时间: 2024-8-3 07:45

本帖最后由 aloha20200628 于 2024-8-3 08:54 编辑

回复 4# gan537519
  1. @echo off &set "kwl=photo/picture/document/TX/data/data"
  2. for /f "delims=" %%F in ('dir /b/s/a-d') do (
  3. set "_p=%%~pF"&setlocal enabledelayedexpansion
  4. for %%p in ("!_p:~0,-1!") do for /f "delims=/" %%a in ("!kwl:*%%~nxp=!") do if /i "!kwl!" neq "!kwl:*%%~nxp=!" (ren "%%F" "%%a_%%~nxF")
  5. endlocal
  6. )
  7. pause&exit/b
复制代码

作者: aloha20200628    时间: 2024-8-3 09:29

本帖最后由 aloha20200628 于 2024-8-3 09:46 编辑


http://www.bathome.net/thread-69489-1-1.html 中3楼示例代码,验证 dir /b "c:\abc\123.txt\.." 可锚定目标文件 123.txt 所在目录,进一步可用
    for %%P in ("c:\abc\123.txt\..") do set "p=%%~nxP"
直接提取目标文件 123.txt 所在目录名(没有尾部路径分隔符),据此可对10楼代码再造一个版本...
  1. @echo off &set "kwl=photo/picture/document/TX/data/data"
  2. for /f "delims=" %%F in ('dir /b/s/a-d') do (
  3. set "_p=%%~pF"&setlocal enabledelayedexpansion
  4. for %%P in ("%%F\..") do for /f "delims=/" %%a in ("!kwl:*%%~nxP=!") do if /i "!kwl!" neq "!kwl:*%%~nxP=!" (echo,ren "%%F" "%%a_%%~nxF")
  5. endlocal
  6. )
  7. pause&exit/b
复制代码

作者: gan537519    时间: 2024-8-3 14:28

回复 9# 77七


    3Q
作者: gan537519    时间: 2024-8-3 14:29

回复 10# aloha20200628


    3Q




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