Board logo

标题: [文件操作] 【练习-048】按文件后缀名整理文件夹 [打印本页]

作者: batman    时间: 2009-6-24 17:47     标题: 【练习-048】按文件后缀名整理文件夹

&&假定有一个文件夹中有各种不同的文件以及子文件夹(子文件夹中也有文
件),现在要求编写批处理将文件夹中的所有文件(包括子文件夹中的文件),集中存
放到以文件后缀名命令的文件夹中(假设文件不会有重名),然后删除原来的子文件夹。
    举例:如原来文件夹中有bat exe txt三种文件,那么运行批处理后文件夹中只剩下
bat exe txt三个子文件夹,而原来所有的bat文件被移动到了bat文件夹中,exe文件被移动
到了exe文件夹中,txt文件被移动到了txt文件夹中。本题满分20分,视情况加分。
---------------------------------------------------------------------
加大难度:
1、需考虑含特殊字符的文件名
2、需考虑不带后缀名的文件(文件夹命令为nosuffix)

[ 本帖最后由 batman 于 2009-6-25 11:29 编辑 ]
作者: Batcher    时间: 2009-6-24 17:51

需要考虑没有后缀名的文件不?
作者: batman    时间: 2009-6-24 17:56

回楼上暂不用考虑,同时请管理层先手下留情,把机会留给大家吧。。。
作者: batman    时间: 2009-6-24 20:16

这是实际运用类的题目,也不难啊,怎么就没人来做题?
作者: defanive    时间: 2009-6-24 20:47

工作日可能人少点。。。
题目不难,支持下。。。
作者: batman    时间: 2009-6-25 00:56

机会给了大家,大家就是不用,好吧,各位,看看你们的代码吧,本人代码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /s /b /a-d') do (
  3.      set "str=%%~xa"&set "_!str:~1!=a"
  4.      if not exist "%cd%\!str:~1!" md %cd%\!str:~1!
  5.      if "%%a" neq "%~0" move /y "%%a" "%cd%\!str:~1!\"
  6. )
  7. for /f "delims=" %%a in ('dir /b /ad') do if not defined _%%a rd /s /q "%%a"
  8. del /q %0
复制代码

[ 本帖最后由 batman 于 2009-6-25 08:06 编辑 ]
作者: 随风    时间: 2009-6-25 10:23

此题还可以扩展,加大难度。
1、需考虑含特殊字符的文件名
2、需考虑不带后缀名的文件
作者: batman    时间: 2009-6-25 10:51

这将加大不少难度,已在顶楼更新
作者: 随风    时间: 2009-6-25 11:22

不带后缀的文件,该创建什么样的文件夹名,是否应该说明下。
作者: netbenton    时间: 2009-6-25 13:40

  1. ::有一个缺点,如果已经存在相应的扩展名为名的目录,会被清空
  2. @echo off&setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /s /b /ad^|sort /r ^&echo .') do (
  4. for %%b in (%%a\*.*) do (
  5. set ext=%%~xb
  6. if defined ext (set ext=!ext:~1!) else (set ext=nosuffix)
  7. xcopy "%%b" !ext!\ /y
  8. )
  9. if "%%a" equ "." (del /q *.*) else (rd /q /s "%%a\")
  10. )
复制代码

作者: netbenton    时间: 2009-6-25 13:57

::好了这个没有清空扩展名为名的目录的问题了。
  1. @echo off&setlocal enabledelayedexpansion
  2. set bax=.nosuffix
  3. for /f "delims=" %%a in ('dir /s /b /ad^|sort /r ^&echo .') do (
  4.         for %%b in (%%a\*.*) do (
  5.                 set ext=%%~xb
  6.                 if defined ext (set ext=!ext:~1!) else (set ext=nosuffix)
  7.                 xcopy "%%b" !ext!\ /y
  8.                 if "!bax:%%~xb=!" equ "!bax!" (set bax=!bax!%%~xb)
  9.                
  10.         )
  11.         if "!bax:.%%~na=!" equ "!bax!" (
  12.                 if "%%a" equ "." (del /q *.*) else (rd /q /s "%%a\")
  13.         )
  14. )
  15. pause
复制代码

作者: 随风    时间: 2009-6-25 14:56     标题: 回复 11楼 的帖子

未测试你的代码
但初看你的代码应该是有问题的
sort /r 并不能向你想的那样先列处最低层的目录,所以你的代码应该会丢失文件。
假设有这样一个目录结构
tem\111.txt
tem\00\22.txt
那么你的代码应该是先复制111.txt 再删除tem目录,结果导致丢失22.txt

还有你的代码 变量 bax 会不断累加
没考虑文件名含!号的情况。
后缀名为 .nos 时也会出错吧?

if "%%a" equ "." (del /q *.*) 此时会删除批处理自身。也很迷惑,在什么时候这里的if条件会成立??
作者: 随风    时间: 2009-6-25 15:23

汗,对sort 的说法有误。。。
作者: netbenton    时间: 2009-6-26 13:51

“bax” 变量的的引入是为了,不删除已经存在的扩展名为名的目录,

sort /r 是排序后,是先处理最底层子目录的,

这里的:
sort /r &echo .
中的echo . 是显示一个点,而不是空行,在处理时会作为当前目录处理。

if "%%a" equ "." (del /q *.*) else (rd /q /s "%%a\")

只有是当前目录才仅仅是删除文件,
否则会删该目录及以下的所有子目录和文件。

这样可以避免删拷贝后的结果

文件中含!号确实11楼还没有考虑到。

下面的可以处理目录及文件名中含有!号,但是不能处理扩展名中含有!号的问题。
  1. @echo off
  2. set bax=.nosuffix
  3. for /f "delims=" %%a in ('dir /s /b /ad^|sort /r ^&echo .') do (
  4. set dir=%%a
  5. setlocal enabledelayedexpansion
  6. for %%b in (!dir!\*.*) do (
  7.   endlocal
  8.   set fil=%%b
  9.   set ext=%%~xb
  10.   setlocal enabledelayedexpansion  
  11.   if defined ext (set ext=!ext:~1!) else (set ext=nosuffix)
  12.   xcopy "!fil!" !ext!\ /y 2>nul 1>nul
  13.   if "!bax:%%~xb=!" equ "!bax!" (set bax=!bax!%%~xb)
  14.   
  15. )
  16. if "!bax:.%%~na=!" equ "!bax!" (
  17.   if "%%a" equ "." (del /q *.*) else (rd /q /s "!dir!\")
  18. )
  19. endlocal
  20. )
  21. pause
复制代码

[ 本帖最后由 netbenton 于 2009-6-26 14:12 编辑 ]
作者: jmz573515    时间: 2009-6-29 10:22

  1. @echo off&setlocal enabledelayedexpansion
  2. for /r . %%i in (*.*) do (
  3. set var=%%~xi
  4. set var=!var:.=!
  5. if not exist !var! md !var!
  6. if "%%i" neq "%~0" move /y "%%i" "!var!\"
  7. )
  8. for /f "delims=" %%i in ('dir /ad /b /s^|sort /r') do rd "%%i\"2>nul
  9. pause
复制代码

[ 本帖最后由 jmz573515 于 2009-6-30 10:03 编辑 ]




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