返回列表 发帖

[文件管理] 批处理文件分类整理器[2008-8-4]

  有些时候,我们需要对某个目录及其所有子目录下的文件按类型进行整理。搜遍网络,没有找到趁手的小工具;在电脑里翻箱倒柜,找到了自己以前写的一段代码,经过一些完善,发出来大家玩玩;如发现bug,或有更好的玩法,欢迎跟帖交流。
@echo off
:: code by namejm bbs.bathome.net  CMD@XP_SP2 2008.8.4
color 1f
mode con lines=30
set TT=文件分类整理器
rem ======= 设置选项 =======
:set_source
cls
title %TT%-当前目录:"%cd%"
echo.&echo.
call :note
echo.&echo.
echo               请把要处理的文件夹拉到本窗口(直接回车将处理当前目录):
echo.
set "source=%cd%"
set /p source=                 
if defined source (
    set "source=%source:"=%"
) else goto set_source
if "%source%"=="1" goto set_source
if "%source%"=="0" exit
if exist "%source%" (
    pushd "%source%" 2>nul && popd || goto set_source
)
:set_destination
title %TT%-源文件路径:"%source%"
cls
call :note
echo.
echo               请输入保存位置的绝对或相对路径,或把目的文件夹拖到本窗口
echo.
echo               直接回车将处理当前目录;
echo.
echo               若目的路径从属于或等同于源路径,或存在同名的非文件夹路径
echo.                             则必须重新选择:
echo.
set destination=
set /p destination=                 
if defined destination set "destination=%destination:"=%"
if defined destination (
    if "%destination%"=="1" goto set_source
    if "%destination%"=="0" exit
) else goto set_destination
echo "%destination%"|findstr ":" || (
    set "destination=%cd%\%destination%"
)
:: 检测是否存在同名的非文件夹路径
if exist "%destination%" (
    pushd "%destination%" 2>nul && popd || goto set_destination
)
:: 判断目的路径是否从属于或等同于源路径
set flag=
call set "flag=%%destination:%source%=%%"
if not defined flag goto set_destination
if "%flag:~0,1%"=="\" goto set_destination
md "%destination%" 2>nul
:set_type
title %TT%-目的路径:"%destination%"
cls
echo.&echo.
call :note
echo.
echo                   请输入要处理的文件类型,多个类型以空格分隔
echo.
echo                     (如:rar exe,直接回车将处理所有类型):
echo.
set type=
set /p type=                     
if defined type (
    if "%type%"=="1" goto set_destination
    if "%type%"=="0" exit
    for %%i in (%type%) do set /p type=*.%%i <nul>nul
) else set type=*.*
rem ======= 按文件类型复制文件 =======
cd /d "%source%"
for /f "delims=" %%i in ('dir /a-d /b /s %type% 2^>nul') do (
    title %TT%-正在处理 "%%i"
    set "file_souce=%%i"
    set "file_destination=%destination%\%%~xi文件\%%~nxi"
    md "%destination%\%%~xi文件" 2>nul
    if not exist "%destination%\%%~xi文件\%%~nxi" (
        copy "%%i" "%destination%\%%~xi文件">nul
    ) else (
        set num=0
        call :rename "%%i" "%destination%\%%~xi文件\%%~ni" "%%~xi"
    )
)
exit
rem ======= 重命名同名文件 =======
:rename
set /a num+=1
set "file_source=%~1"
set "file_destination=%~2_%num%%~3"
if not exist "%file_destination%" (
    copy "%file_source%" "%file_destination%">nul
) else goto rename
goto :eof
:note
echo                               ╭────────╮
echo           ╭─────────┤  功 能 说  明  ├─────────╮
echo           │                  ╰────────╯                  │
echo           │                                                        │
echo           │        本程序能对当前目录及其所有子目录下的文件进行    │
echo           │                                                        │
echo           │    归类,具体效果如下:                                │
echo           │                                                        │
echo           │        在指定目录下,以指定的文件类型名为文件夹名      │
echo           │                                                        │
echo           │    建立形如 .exe文件、.rar文件 之类的文件夹,不同      │
echo           │                                                        │
echo           │    类型的文件复制到对应的文件夹下,并自动重命名同      │
echo           │                                                        │
echo           │    名文件:如有重名,则直接在文件名后加"_序号"。       │
echo           │                                                        │
echo           ╰────────────────────────────╯
echo.
echo               返回上一步请按 1                         退出请按 0
echo.           ─────────────────────────────
goto :eofCOPY
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

顶,好东西!!!
***共同提高***

TOP

学习学习!!

TOP

厉害!
学习了~~~好好!
又一个问题被namejm了

[ 本帖最后由 zhoumeng 于 2008-8-4 22:07 编辑 ]

TOP

厉害!~
心绪平和,眼藏静谧。

TOP

很实用,顶了..

TOP

我刚好需要啊

TOP

回复 1# namejm


    超级强大
天天向上

TOP

返回列表