吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1254|回复: 60
收起左侧

[学习记录] bat批处理之&文件归类归档

  [复制链接]
zhengzhenhui945 发表于 2024-7-23 18:19
本帖最后由 zhengzhenhui945 于 2024-8-17 19:11 编辑

====为了大家详细了解都添加了注释===场景1 为每种格式的文件加前缀并排序
     例如  fhjks.txt  fhjks.jpg    重命名后         txt001.txt    jpg001.jpg
[Asm] 纯文本查看 复制代码
@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
按找对应的格式文件创建文件夹并移入
[Shell] 纯文本查看 复制代码
@echo off  ; 关闭命令回显
setlocal EnableExtensions EnableDelayedExpansion  ; 启用命令扩展和延迟环境变量扩展

for %%i in (*) do (  ; 遍历当前目录下的所有文件和文件夹
    if /i "%%~xi" neq ".bat" (  ; 如果文件扩展名(不区分大小写)不是 ".bat"
        md "%%~xi"  ; 创建一个以文件扩展名命名的文件夹
        move "*%%~xi" "%%~xi"  ; 将所有具有该扩展名的文件移动到相应的文件夹中
    )
)
pause  ; 暂停,等待用户按键

场景3   
以子文件夹名称作为文件名的前缀
[Shell] 纯文本查看 复制代码
@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
只取特殊符号左边的字命名文件夹并移入
例如  数学-五年-六班      处理结果 新建名为【数学】文件夹并移入
[Shell] 纯文本查看 复制代码
@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个分配于文件夹内
数量可以在代码里面改
[Shell] 纯文本查看 复制代码
@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
提取当前目录下所有包含某些关键字的文件并移入指定名称文件夹(当前目录),没有则创建
指定名称文件夹(是在当前目录)
[Shell] 纯文本查看 复制代码
@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  这个批处理放在当前文件夹内处理即可

下面这个是没有遍历子文件夹,只是获取当前文件夹的文件
[Shell] 纯文本查看 复制代码
@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
遍历到关键词后移入指定文件夹,并以关键词作二次分类
[Shell] 纯文本查看 复制代码
@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成品下载下载链接: BAT成品下载.txt (41 Bytes, 下载次数: 54)
免费评分支持一下,俺想早点升级换个头像

免费评分

参与人数 17吾爱币 +17 热心值 +14 收起 理由
懒人 + 1 我很赞同!
iSummerice + 1 + 1 用心讨论,共获提升!
psj736213 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yanglinman + 1 谢谢@Thanks!
Biggercong + 1 我很赞同!
7qidai + 1 我很赞同!
5iAnn2020 + 1 谢谢@Thanks!
LXGZJ237 + 1 + 1 我很赞同!
alidadai + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lccccccc + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hsw6512678 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hoochanlon + 3 + 1 谢谢@Thanks!
TADYCB + 1 + 1 我很赞同!
kingtiger + 1 + 1 谢谢@Thanks!
zbaby523 + 1 + 1 谢谢@Thanks!
kobely + 1 + 1 正需要呢,谢谢
zhangfei.892 + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| zhengzhenhui945 发表于 2024-7-24 01:14
本帖最后由 zhengzhenhui945 于 2024-7-24 14:36 编辑

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

[Shell] 纯文本查看 复制代码
@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
有什么宝贵建议,大家可以互相分享一下
办公场景还是批处理好玩
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
不错谢谢分享,收了编译成程序用

哈哈,期待你的成品
loikee 发表于 2024-7-23 19:23
这个真好,去年自己半吊子搞半天没实现,要不运行不起来,要不动起来编的数不对,非常感谢有人做了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-13 18:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表