zhengzhenhui945 发表于 2024-7-23 18:19

bat批处理之&文件归类归档

本帖最后由 zhengzhenhui945 于 2024-8-17 19:11 编辑

====为了大家详细了解都添加了注释===场景1 为每种格式的文件加前缀并排序
   例如fhjks.txtfhjks.jpg    重命名后         txt001.txt    jpg001.jpg
@echo off
rem 为了方便了解都添加了注释
rem 开始一个循环,遍历指定的文件扩展名
for %%i in (gif jpg webp jpeg png txt) do (
    setlocal enabledelayedexpansion
    rem 对于每个扩展名,在当前目录中查找具有该扩展名的文件
    for /f "delims=" %%j in ('dir /b /a-d "*.%%i"') do (
      rem 计数器自增 1
      set /a n+=1
      rem 在计数器前面添加 0 以达到三位数,然后取后三位
      set m=00!n!
      set m=!m:~-3!
      rem 重命名文件,新文件名格式为 "扩展名-三位数序号.扩展名"
      ren "%%j" "%%i-!m!.%%i"
    )
    endlocal
)
rem 暂停,等待用户按下任意键
pause
场景2
按找对应的格式文件创建文件夹并移入
@echo off; 关闭命令回显
setlocal EnableExtensions EnableDelayedExpansion; 启用命令扩展和延迟环境变量扩展

for %%i in (*) do (; 遍历当前目录下的所有文件和文件夹
    if /i "%%~xi" neq ".bat" (; 如果文件扩展名(不区分大小写)不是 ".bat"
      md "%%~xi"; 创建一个以文件扩展名命名的文件夹
      move "*%%~xi" "%%~xi"; 将所有具有该扩展名的文件移动到相应的文件夹中
    )
)
pause; 暂停,等待用户按键
场景3   
以子文件夹名称作为文件名的前缀
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /b /s /ad') do (// 遍历当前目录及其子目录中的所有文件夹
    echo 正在处理文件夹 %%a// 输出正在处理的文件夹名称
    pushd "%%a"// 进入该文件夹
    set n=0// 初始化计数器为 0
    for /f "delims=" %%b in ('dir /b /a-d *.png') do (// 遍历该文件夹中的所有 PNG 图片文件
      set /a n+=1// 计数器加 1
      ren "%%b" "%%~nxa-!n!%%~xb"// 重命名当前图片文件,格式为 "原文件名-计数器值.扩展名"
    )
    popd// 退出当前文件夹
)
场景4
只取特殊符号左边的字命名文件夹并移入
例如数学-五年-六班      处理结果 新建名为【数学】文件夹并移入
@echo off; 关闭命令行的回显
cd /d "%~dp0"; 切换到当前批处理文件所在的目录

setlocal enabledelayedexpansion; 启用延迟环境变量扩展

for /f "delims=" %%D in ('dir /ad /b /s') do (; 遍历所有子目录
    pushd "%%D"; 进入当前子目录
    for /f "delims=" %%i in ('dir /b /a-d "*-*"') do (; 遍历当前子目录中符合"*-*"格式的文件
      set "filename=%%i"; 设置当前文件名
      for /f "tokens=1* delims=-" %%a in ("!filename!") do (; 以"-"为分隔符拆分文件名
            set "folderName=%%a"; 获取拆分后的第一部分作为文件夹名
            if not exist "!folderName!" (; 如果该文件夹不存在
                md "!folderName!"; 创建该文件夹
            )
            move "%%i" "!folderName!"; 将文件移动到对应的文件夹
      )
    )
    popd; 退出当前子目录
)
场景5
把当前目录下的文件 平均为5个分配于文件夹内
数量可以在代码里面改
@echo off&setlocal enabledelayedexpansion
echo;&echo;    不要慌!开始整理……&echo;
set 整理的文件夹f=0
set numf=0
set conf=0
if not exist 整理的文件夹!整理的文件夹f! md 整理的文件夹!整理的文件夹f!
for /f "tokens=*" %%a in ('dir /b /a-d') do (
    if !numf! geq 5 set numf=0&set /a 整理的文件夹f+=1&md 整理的文件夹!整理的文件夹f!
    if not "%%~na"=="%~n0" move "%%~a" 整理的文件夹!整理的文件夹f!&set /a numf+=1
    set /a conf=!整理的文件夹f!*5+!numf!
)
echo;&echo;    整理完成,共 !conf! 个文件,请注意检查!&pause>nul

场景6
提取当前目录下所有包含某些关键字的文件并移入指定名称文件夹(当前目录),没有则创建
指定名称文件夹(是在当前目录)
@echo off
setlocal EnableDelayedExpansion

cd /d "%~dp0"

rem 定义要匹配的关键字和目标文件夹
set "keywords=周杰伦 林俊杰 张惠妹 刘德华"
set "targetFolder=爱听的文件夹"

rem 检查并创建目标文件夹
if not exist "%targetFolder%" (
    mkdir "%targetFolder%"
)

rem 通过循环检查关键字,使用findstr进行匹配
for /r %%a in (*.*) do (
    set "fileName=%%~nxa"
    for %%k in (%keywords%) do (
      if /i "!fileName!" neq "!fileName:*%%k=!" (
            echo Moving "%%a" to "%targetFolder%"
            move "%%a" "%targetFolder%" >nul 2>&1 || echo Error moving file: "%%a"
      )
    )
)

endlocal
rem这个批处理放在当前文件夹内处理即可
下面这个是没有遍历子文件夹,只是获取当前文件夹的文件
@echo off
setlocal EnableDelayedExpansion

cd /d "%~dp0"

rem 定义要匹配的关键字和目标文件夹
set "keywords=周杰伦 林俊杰 张惠妹 刘德华"
set "targetFolder=爱听的文件夹"


rem 检查并创建目标文件夹
if not exist "%targetFolder%" (
    mkdir "%targetFolder%"
)

rem 使用 findstr 对关键字进行模糊匹配
for /r %%a in (*.*) do (
    set "fileName=%%~nxa"
    for /f "tokens=*" %%b in ('echo !fileName! ^| findstr /i "%keywords%"') do (
      echo Moving "%%a" to "%targetFolder%"
      move "%%a" "%targetFolder%\" >nul 2>&1 || echo Error moving file: "%%a"
    )
)

endlocal
场景7
遍历到关键词后移入指定文件夹,并以关键词作二次分类
@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"
rem 定义要匹配的关键字和目标文件夹
set "keywords=周杰伦 林俊杰 张惠妹 刘德华"
set "targetFolder=爱听的文件夹"
if not exist "%targetFolder%" (
    mkdir "%targetFolder%"
)
for /r %%a in (*.*) do (
    set "fileName=%%~nxa"
    for %%k in (%keywords%) do (
      if /i "!fileName!" neq "!fileName:*%%k=!" (
            echo Moving "%%a" to "%targetFolder%"
            move "%%a" "%targetFolder%"
      )
    )
)

for %%k in (%keywords%) do (
    set "subFolder=%targetFolder%\%%~k"
    if not exist "!subFolder!" (
      mkdir "!subFolder!"
    )
)

for /r "%targetFolder%" %%b in (*) do (
    set "fileName=%%~nb"
    for %%k in (%keywords%) do (
      if /i "!fileName!" neq "!fileName:*%%k=!" (
            echo Moving "%%b" to "%targetFolder%\%%k"
            move "%%b" "%targetFolder%\%%k"
      )
    )
)

endlocal

使用方法【把代码保存下来,粘贴到txt,将.txt后缀改为.bat后缀,放到自己需要处理的目录即可】
测试文件请做好备份!!
BAT成品下载下载链接:
免费评分支持一下,俺想早点升级换个头像

zhengzhenhui945 发表于 2024-7-24 01:14

本帖最后由 zhengzhenhui945 于 2024-7-24 14:36 编辑

请务必备份了先测试文件!!!!!
以下是提取文件后删除空文件夹,
遇到同名文件会在后缀从 _1 开始递增
做好备份   在测试的文件夹内提取出文件再做归类

@echo off

rem 提取文件到根目录
for /r "%cd%" %%f in (*) do (
    set "newName=%%~nf"
    set "ext=%%~xf"
    setlocal enabledelayedexpansion
    if exist "!newName!!ext!" (
      set /a count=1
      :loop
      if not exist "!newName!_!count!!ext!" (
            move "%%f" "!newName!_!count!!ext!"
            goto :next
      )
      set /a count+=1
      goto :loop
    )
    move "%%f" "!newName!!ext!"
    :next
    endlocal
)

rem 删除空文件夹
for /d %%d in (*) do (
    rd "%%d" 2>nul
)

chenxingfeng 发表于 2024-7-23 18:24

就喜欢看别人编的批处理

changyufeichang 发表于 2024-7-23 18:29

好东西,收藏起来

binguochen 发表于 2024-7-23 18:36

好东西,谢谢分享!

zhengzhenhui945 发表于 2024-7-23 18:42

有什么宝贵建议,大家可以互相分享一下{:1_918:}
办公场景还是批处理好玩{:1_893:}

ST5SJ6XF7tb6 发表于 2024-7-23 18:45

就喜欢这样简单快捷的处理方式。命令行方式有时候确实能完成很多工作,还快速!

fudd 发表于 2024-7-23 18:46

感谢!!

kangta520 发表于 2024-7-23 19:00

不错谢谢分享,收了编译成程序用

zhengzhenhui945 发表于 2024-7-23 19:05

kangta520 发表于 2024-7-23 19:00
不错谢谢分享,收了编译成程序用

哈哈,期待你的成品:victory:

loikee 发表于 2024-7-23 19:23

这个真好,去年自己半吊子搞半天没实现,要不运行不起来,要不动起来编的数不对,非常感谢有人做了
页: [1] 2 3 4 5 6 7
查看完整版本: bat批处理之&文件归类归档