标题: [文件操作] 【练习-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
机会给了大家,大家就是不用,好吧,各位,看看你们的代码吧,本人代码如下:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /s /b /a-d') do (
- set "str=%%~xa"&set "_!str:~1!=a"
- if not exist "%cd%\!str:~1!" md %cd%\!str:~1!
- if "%%a" neq "%~0" move /y "%%a" "%cd%\!str:~1!\"
- )
- for /f "delims=" %%a in ('dir /b /ad') do if not defined _%%a rd /s /q "%%a"
- 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
- ::有一个缺点,如果已经存在相应的扩展名为名的目录,会被清空
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /s /b /ad^|sort /r ^&echo .') do (
- for %%b in (%%a\*.*) do (
- set ext=%%~xb
- if defined ext (set ext=!ext:~1!) else (set ext=nosuffix)
- xcopy "%%b" !ext!\ /y
-
- )
- if "%%a" equ "." (del /q *.*) else (rd /q /s "%%a\")
- )
复制代码
作者: netbenton 时间: 2009-6-25 13:57
::好了这个没有清空扩展名为名的目录的问题了。- @echo off&setlocal enabledelayedexpansion
- set bax=.nosuffix
- for /f "delims=" %%a in ('dir /s /b /ad^|sort /r ^&echo .') do (
- for %%b in (%%a\*.*) do (
- set ext=%%~xb
- if defined ext (set ext=!ext:~1!) else (set ext=nosuffix)
- xcopy "%%b" !ext!\ /y
- if "!bax:%%~xb=!" equ "!bax!" (set bax=!bax!%%~xb)
-
- )
- if "!bax:.%%~na=!" equ "!bax!" (
- if "%%a" equ "." (del /q *.*) else (rd /q /s "%%a\")
- )
-
- )
- 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楼还没有考虑到。
下面的可以处理目录及文件名中含有!号,但是不能处理扩展名中含有!号的问题。
- @echo off
- set bax=.nosuffix
- for /f "delims=" %%a in ('dir /s /b /ad^|sort /r ^&echo .') do (
- set dir=%%a
- setlocal enabledelayedexpansion
- for %%b in (!dir!\*.*) do (
- endlocal
- set fil=%%b
- set ext=%%~xb
- setlocal enabledelayedexpansion
- if defined ext (set ext=!ext:~1!) else (set ext=nosuffix)
- xcopy "!fil!" !ext!\ /y 2>nul 1>nul
- if "!bax:%%~xb=!" equ "!bax!" (set bax=!bax!%%~xb)
-
- )
- if "!bax:.%%~na=!" equ "!bax!" (
- if "%%a" equ "." (del /q *.*) else (rd /q /s "!dir!\")
- )
- endlocal
-
- )
- pause
复制代码
[ 本帖最后由 netbenton 于 2009-6-26 14:12 编辑 ]
作者: jmz573515 时间: 2009-6-29 10:22
- @echo off&setlocal enabledelayedexpansion
- for /r . %%i in (*.*) do (
- set var=%%~xi
- set var=!var:.=!
- if not exist !var! md !var!
- if "%%i" neq "%~0" move /y "%%i" "!var!\"
- )
- for /f "delims=" %%i in ('dir /ad /b /s^|sort /r') do rd "%%i\"2>nul
- pause
复制代码
[ 本帖最后由 jmz573515 于 2009-6-30 10:03 编辑 ]
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |