[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【练习-048】按文件后缀名整理文件夹

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

[ 本帖最后由 batman 于 2009-6-25 11:29 编辑 ]
***共同提高***

需要考虑没有后缀名的文件不?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回楼上暂不用考虑,同时请管理层先手下留情,把机会留给大家吧。。。
***共同提高***

TOP

这是实际运用类的题目,也不难啊,怎么就没人来做题?
***共同提高***

TOP

工作日可能人少点。。。
题目不难,支持下。。。
第三方命令行工具编程
Http://Hi.Baidu.Com/Console_App

TOP

机会给了大家,大家就是不用,好吧,各位,看看你们的代码吧,本人代码如下:
  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 编辑 ]
***共同提高***

TOP

此题还可以扩展,加大难度。
1、需考虑含特殊字符的文件名
2、需考虑不带后缀名的文件
技术问题请到论坛发帖求助!

TOP

这将加大不少难度,已在顶楼更新
***共同提高***

TOP

不带后缀的文件,该创建什么样的文件夹名,是否应该说明下。
技术问题请到论坛发帖求助!

TOP

  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. )
复制代码

TOP

::好了这个没有清空扩展名为名的目录的问题了。
  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
复制代码

TOP

回复 11楼 的帖子

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

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

if "%%a" equ "." (del /q *.*) 此时会删除批处理自身。也很迷惑,在什么时候这里的if条件会成立??
技术问题请到论坛发帖求助!

TOP

汗,对sort 的说法有误。。。
技术问题请到论坛发帖求助!

TOP

“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 编辑 ]

TOP

  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 编辑 ]

TOP

返回列表