Board logo

标题: 按文件类型归类文件批处理版 [06.12.17更新] [打印本页]

作者: namejm     时间: 2006-12-16 12:25    标题: 按文件类型归类文件批处理版 [06.12.17更新]

  头两天 jmz573515 兄做了一个VBS版的文件归类脚本(点 这里 查看),能对当前目录下的文件按类型归类。受这个想法的启发,我做了一个能对指定路径下的目录及其子目录里的文件进行归类的批处理,只是简单地检测了一些出错情形,发出来让大家测试一下:
@echo off
mode con lines=28
title 文件归类整理器-test

::===================================================================================
:: 目的:
::
::     对当前目录及其所有子目录下的文件进行归类。
::
:: 整理结果:
::
::   在当前目录及其子目录下,以该文件夹里的文件类型名为文件夹名,在该文件
:: 所在目录下建立形如 exe文件、rar文件 之类的文件夹,不同类型的文件移动到
:: 对应的文件夹下。
::   如果以后增添了新文件,再次运行本脚本时,若该位置已经存在对应的文件夹,
:: 将把新添的文件保存在该文件夹下;若不存在对应的文件夹,将新建文件夹以保存
:: 该文件。
::
:: 已发现的问题:
::   ① move 命令无法移动 系统 或 隐藏 属性的文件;
::   ② 不会整理无类型的文件。
::
:: 下一版将要实现的功能:
::
::   ① 对以当前目录为起点,指定层深的子目录进行整理;
::   ② 整理指定类型以外的文件。
::
:: 更新历史:
::
:: 06.12.17
::   修正了遇到无类型文件会自动退出的错误;更新了获取相对路径的代码,效率有所提升;
::
:: 06.12.16
::   增添了如下功能(V1.1):
::     ① 能指定要处理的文件夹以及保存路径;
::     ② 能指定要整理的类型;
::     ③ 跳过已经整理的文件;
::
:: 06.12.15
::   在只能整理当前目录下不同类型文件的基础上,写出了能对当前目录及其所有子目录下的
:: 不同类型文件进行操作的代码,此为V1.0;
::===================================================================================

:note
cls
title 文件归类整理器-说明

echo                               ╭────────╮
echo           ╭─────────┤  功 能 说  明  ├─────────╮
echo           │                  ╰────────╯                  │
echo           │                                                        │
echo           │        本程序能对当前目录及其所有子目录下的文件进行    │
echo           │                                                        │
echo           │    归类,具体效果如下:                                │
echo           │                                                        │
echo           │        在当前目录及其子目录下,以该文件夹里的文件      │
echo           │                                                        │
echo           │    类型名为文件夹名,在该文件所在目录下建立形如        │
echo           │                                                        │
echo           │    exe文件、rar文件 之类的文件夹,不同类型的文件移     │
echo           │                                                        │
echo           │    动到对应的文件夹下,以保持原来的文件夹结构不变。    │
echo           │                                                        │
echo           │        如果以后增添了新文件,再次运行本脚本时,若      │
echo           │                                                        │
echo           │    该位置已经存在对应的文件夹,将把新添的文件保存      │
echo           │                                                        │
echo           │    在该文件夹下;若不存在对应的文件夹,将新建文件      │
echo           │                                                        │
echo           │    夹以保存该文件。                                    │
echo           │                                                        │
echo           ╰────────────────────────────╯
echo.
echo                                                按任意键进入下一步...
pause>nul

:config
cls
title 文件归类整理器-参数设置
echo.
echo.
echo.
echo.
echo         请把要处理的文件夹拉到本窗口(直接回车将处理当前目录):
echo.
set "source_path=%cd%"
set /p source_path=                 
echo.
echo          请输入保存位置绝对路径(直接回车将保存在源文件夹下):
set destination_path=
set /p destination_path=                 
echo.
echo             请输入要处理的文件类型,多个类型以空格分隔
echo.
echo                (如:rar exe;直接回车将处理所有类型):
echo.
set type_included=
set /p type_included=                 


if exist "%source_path:"=%" (
    set "source_path=%source_path:"=%\"
) else goto config
set "source_dir=%source_path:"=%"

rem ======= 计算源文件夹的层深 =======
set source_layers=0
set "source_dir_tmp=%source_dir%"
:get_source_layers
set "source_dir_tmp=%source_dir_tmp:*\=%"
set /a source_layers+=1
if not "%source_dir_tmp%"=="" goto get_source_layers

if defined destination_path set destination=yes

for /f "delims=" %%i in ('dir /a-d /b /s /oe "%source_path%"') do (
    set "nx_name=%%~nxi"
    call :build_dir "%%~xi" "%%~dpi"
    set file_type=%%~xi
    set "source_path=%%~dpi"
)
goto :eof

rem ======= 按文件类型创建文件夹 =======
:build_dir
set include=
for %%i in (%type_included%) do if /i "%1"==".%%i" set include=yes
if defined type_included if not defined include goto :eof
set types=%1
if %types%=="" goto :eof
set types=%types:~2,-1%

if not defined destination set destination_path=%2

set "destination_path=%destination_path:"=%"
if not "%destination_path:~-1%"=="\" set "destination_path=%destination_path%\"

rem ======= 获取文件在源文件中的相对位置 =======
set source_sub_path=%2
set "source_sub_path=%source_sub_path:"=%"
set num=0
:get_source_sub_path
set "source_sub_path=%source_sub_path:*\=%"
set /a num+=1
if not %num% equ %source_layers% goto get_source_sub_path


rem ======= 获取文件所在路径的目录名 =======
for /f "delims=" %%i in ("%destination_path:~0,-1%") do set "source_name=%%~nxi"

:: 通过对比文件类型名和文件所在路径的目录名来判断哪些文件已经整理过

if "%source_name%"=="%types%文件" goto :eof

:: 判断文件所在位置是否发生了变化
if %2=="%source_path%" (set chang_dir=) else set chang_dir=yes&set file_type=

:: 判断要处理的文件是不是批处理文件自身
if "%destination_path%%nx_name%"=="%~f0" (set file_self=yes) else set file_self=

:: 判断文件类型是否发生了变化

if /i "%1"=="%file_type%" (set same_type=yes) else set same_type=
if not defined destination set source_sub_path=

if not defined chang_dir (
    if not defined file_self if not defined same_type md "%destination_path%%source_sub_path%%types%文件" 2>nul
) else (
    if not defined file_self if not defined same_type md "%destination_path%%source_sub_path%%types%文件" 2>nul
)
if not defined file_self move /-y %2"%nx_name%" "%destination_path%%source_sub_path%%types%文件"
goto :eof

:: source_path:源文件夹路径
:: source_layers:源文件夹的层深
:: destination_path:目的文件夹路径
:: include:要排除的文件类型
:: destination:标志变量,用来判断是否指定目的文件夹路径
:: nx_name:源文件的文件名和后缀名组合
:: file_type:源文件的类型
:: source_sub_path:源文件相对于源文件夹的路径
:: source_path_tmp:源文件夹路径的临时变量
:: source_name:源文件名
:: source_name_tmp:源文件名临时变量
:: chang_dir:判断文件夹是否发生变化的标志
:: same_type:判断文件类型是否相同的变量
:: file_self:判断是不是批处理文件自身的变量
:: included:要处理的文件类型
:: type_included:决定是否处理当前文件类型的标志
  顺便把我写的那段只能对当前目录下的文件进行归类的代码复制过来,以方便大家做对比测试:
@echo off
title 文件归类整理器

:: 目的:
::
::   对当前目录下的不同文件进行归类操作(不处理子目录)
::
:: 2006-12-16 修改了一处错误

for /f "delims=" %%i in ('dir /a-d /b /oe') do (
    set "nx_name=%%~nxi"
    call :build_dir %%~xi
    set file_type=%%~xi

)
goto :eof

rem ======= 按文件类型创建文件夹 =======
:build_dir
set types=%1
set types=%types:~1%

:: 判断要处理的文件是不是批处理自身
if "%nx_name%"=="%~nx0" (set file_self=yes&set file_type=) else set file_self=

:: 判断文件类型是否发生了变化
if "%file_type%"=="%1" (set same_type=yes) else set same_type=

if not defined file_self if not defined same_type md %types%文件 2>nul
if not defined file_self move /-y "%nx_name%" %types%文件
goto :eof
[ Last edited by namejm on 2006-12-17 at 09:37 PM ]
作者: ccwan     时间: 2006-12-16 21:07
加了分再说话。
      有了兄的这个代码,以后整理计算机文件方便多了。
      但同时又有一个问题,把所有子目录文件都归入文件夹,类似免安装的绿软可能就无法使用了。所以放软件的磁盘里最好不用,但整理文档可方便多了^_^ 谢谢
作者: jmz573515     时间: 2006-12-16 21:33
好东西!
楼主能不能说一下运行后的结果,我不敢用啊,怕把电脑里的东西都给打烂了 :(

[ Last edited by jmz573515 on 2006-12-16 at 08:38 AM ]
作者: namejm     时间: 2006-12-16 23:27
  在顶楼已经添加了使用说明,请测试。
作者: donpps     时间: 2006-12-17 00:09
功能过于强大,不要乱试。最好能够在执行前有个警告提示,或者可以选择归类那些类型的文档,比如办公文档,图像文件等,或者可以选择是移动还是复制,或者可以选择是移动到原来的文件夹还是到某一个文件夹(比如p处理所在文件夹)。
作者: namejm     时间: 2006-12-17 00:33


  Quote:
Originally posted by donpps at 2006-12-16 11:09:
最好能够在执行前有个警告提示,或者可以选择归类那些类型的文档,比如办公文档,图像文件等,或者可以选择是移动还是复制,或者可以选择是移动到原来的文件夹还是到某一个文件夹(比如p处理所在文件夹)。

  多谢你的建议,后续版本中将加入这些功能。同时也希望各位能多提建议,毕竟光靠一个人的经验是不能做到十分人性化的。
作者: donpps     时间: 2006-12-18 08:48
好像有点问题,如果存在无扩展名文件时,不执行程序。
作者: namejm     时间: 2006-12-18 09:02
  是的,无扩展名的文件目前还不能处理,以后再慢慢完善。
作者: milertom     时间: 2007-6-17 12:10
顶老大,
看实例,学批处理

[ Last edited by milertom on 2007-6-17 at 12:36 PM ]