标题: [其他] [已解决]如何用批处理批量移动文件或文件夹? [打印本页]
作者: smallbear 时间: 2010-4-5 13:10 标题: [已解决]如何用批处理批量移动文件或文件夹?
小弟想用一批处理批量移动文件或文件夹。例如:我在桌面上选中一大堆文件拖到该批处理文件上,则自动将这一大堆文件移动到d:\123文件夹中
请高手不吝赐教。谢谢。
[ 本帖最后由 smallbear 于 2010-4-5 19:49 编辑 ]
作者: smallbear 时间: 2010-4-5 13:17
我自己写了一个复制代码
我把文件拖动到该批处理上发现它一次只能移动一个文件,而且不能移动文件夹。请高手写个更好的代码。谢谢。
作者: hanyeguxing 时间: 2010-4-5 13:22
@echo off
if not exist "d:\123" md "d:\123"
move "%*" "d:\123"
如果确认"d:\123" 存在,可以不用if not exist "d:\123" md "d:\123"
[ 本帖最后由 hanyeguxing 于 2010-4-5 13:24 编辑 ]
作者: smallbear 时间: 2010-4-5 13:25
谢谢楼上的兄弟,我先试试。
作者: smallbear 时间: 2010-4-5 13:31
不行啊,还是只能移动一个文件,同样不能移动文件夹
作者: hy55310 时间: 2010-4-5 13:59
move不能跨分区移动文件夹
作者: hanyeguxing 时间: 2010-4-5 14:07
原帖由 smallbear 于 2010-4-5 13:31 发表
不行啊,还是只能移动一个文件,同样不能移动文件夹
move在移动目录时,只能在同分区内操作
作者: smallbear 时间: 2010-4-5 14:15
那有没有其它办法?既能移动文件又能移动文件夹,而且能批量移动?
作者: hanyeguxing 时间: 2010-4-5 14:21
原帖由 smallbear 于 2010-4-5 14:15 发表
那有没有其它办法?既能移动文件又能移动文件夹,而且能批量移动?
移动不是问题,麻烦的是你要支持拖放,还得支持路径及名称中有空格
作者: smallbear 时间: 2010-4-5 14:46
这里有一个,哪位高手帮我改一下- @echo off
- if exist "%~1\" (echo d|xcopy %1 /e /r /k "d:\123\%~n1" && rd /s /q %1) else (move /y %1 "d:\123\")
- pause
复制代码
这个代码可以移动文件及文件夹,可惜一次只能移动一个,希望哪位高手给我改成一次移动多个文件。谢谢。
作者: FOR 时间: 2010-4-5 14:55
http://www.bathome.net/viewthrea ... hlight=%D2%C6%B6%AF
作者: smallbear 时间: 2010-4-5 15:05
楼上给我的这个链接我试了一下,这个代码不能拖放。不知道别人试过没有,反正我的vista上不能拖放。
作者: hanyeguxing 时间: 2010-4-5 15:38
- @echo off&setlocal enabledelayedexpansion
- set "d=d:\123"
- if not exist "%d%" md "%d%"
- for /F "delims=" %%a in ("%*") do (set a=%%a
- set a=!a:"=/!
- set a=!a:/ /=/!
- call:han "!a!")
- for /F "delims=" %%i in (temp.h) do if exist "%%~i\" (
- xcopy "%%i" /q /e /h /k /i "%d%\%%~ni\">nul
- rd /s /q "%%i"
- ) else move "%%i" "%d%"
- del /q temp.h
- goto :eof
- :han
- set "i=%~1"&set n=0
- :ye
- if "!i:~%n%,1!"=="" goto :eof
- if "!i:~%n%,1!"=="/" (echo.>>temp.h)else set/p=!i:~%n%,1!<nul>>temp.h
- set/a n+=1&goto :ye
复制代码
在xp sp3下:
多目录拖放操作测试通过
多文件拖放操作测试通过
多目录及文件混合拖放操作测试通过
路径中含空格测试通过
批处理在运行中会产生临时文件temp.h并在结束前删除
作者: smallbear 时间: 2010-4-5 15:55
先谢谢了。我试了一下,在vista中文件夹只能移动一个,文件可以移动多个。再到XP下试试。
作者: FOR 时间: 2010-4-5 16:21
文件名不能含 & 符号
代码未测试,运行前请先做好备份!!!
:- @echo off
- set "var=%*"
- cls
- for %%i in (%var%) do (
- if not exist "%%~i\" (
- if not exist "%%~i" (
- echo 没有 %%~i 文件(夹),请检查文件名是否含 ^& 符号
- ) else (move "%%~i" "d:\123\")
- ) else (
- if /i "%%~di"=="d:" (move "%%~i" "d:\123\") else (
- rem 移动文件夹
- for /f "delims=" %%j in ('dir/b/s/a-d "%%~i\*.*"') do (
- set "num=%%~dpj"
- setlocal enabledelayedexpansion
- set "num=d:\123!num:*%%~i=!\"
- if not exist "!num!" md "!num!"
- move "%%~i\%%~nxj" "!num!"
- endlocal
- )
- rd /s /q "%%~i"
- )
- )
- )
- pause
复制代码
[ 本帖最后由 FOR 于 2010-4-5 17:22 编辑 ]
作者: smallbear 时间: 2010-4-5 16:23
先谢谢楼上的兄弟,我试试,另外13楼的兄弟写的代码可用。但是文件名不能带“()”。
作者: smallbear 时间: 2010-4-5 16:25
15楼的兄弟的代码我试了一下,不能移动文件夹。
作者: FOR 时间: 2010-4-5 16:28
应该是空文件夹没有删除吧,再试试,以修改过。
作者: smallbear 时间: 2010-4-5 16:39
楼上的兄弟,代码我测试了一下,还是不行,不支持文件夹,文件夹没有移动过去,而且把原文件夹删除掉了。
另外十三楼的兄弟的代码好像不支持U盘上的文件 。
作者: smallbear 时间: 2010-4-5 16:57
十三楼的代码在硬盘中测试基本上没有什么问题,就是文件名不能带“()”。但是如果是移动U盘中的文件或者文件夹,那么一次只能移动一个。十五楼的兄弟的代码我测试了一下,不支持移动文件夹,只能批量移动文件。但是可以批量移动U盘中的文件。
作者: FOR 时间: 2010-4-5 17:23
再试试~。。。。。。。。。。。。。。。。。。
作者: namejm 时间: 2010-4-5 19:20
思路:用 %* 来接收多个参数,然后,用move移动文件及同分区内的文件夹,当移动跨分区的文件夹失败时,用xcopy来移动,移动完之后删除源文件夹即可。
试试如下代码:- @echo off
- md d:\123 2>nul
- for %%i in (%*) do (
- move /y "%%~i" d:\123 2>nul||(
- xcopy /e /s /k /o /q /y "%%~i" "d:\123\%%~nxi\"&&rd /q /s "%%~i"
- )
- )
- pause
复制代码
作者: smallbear 时间: 2010-4-5 19:47
感谢管理员的代码,很好用。简单测试了一下,还没发现对文件名有什么特殊要求。
同时也感谢以上所有提供帮助的朋友。
非常感谢。
作者: smallbear 时间: 2010-4-5 19:51
测试了,很好,只是文件名不能有“()”。谢谢
同时也感谢所有给我提供帮助 的朋友。
作者: namejm 时间: 2010-4-5 20:10
我测试过了带括号的文件名,是可以的,不知道你用的什么样的文件名,请给个例子看看。
另外,你的系统是什么环境?我的是WinXP_Sp3。
作者: smallbear 时间: 2010-4-5 20:44
正是不好意思,是我的失误。带括号的文件夹是可以移动的,文件名中有空格的文件夹不能移动。能否再想想办法?
作者: namejm 时间: 2010-4-5 20:59
呵呵,失误失误,在用xcopy复制文件夹的时候,对目的路径没有用引号括起来,导致出错。
22楼的代码已经更新了,请再次测试。
作者: smallbear 时间: 2010-4-5 21:08
测试了一下,现在又出现了其它问题。对于本地硬盘上的文件及文件夹已经没问题了,但是如果是移动U盘上的文件的话,那么文件名里面不能有括号。
[ 本帖最后由 smallbear 于 2010-4-5 21:11 编辑 ]
作者: namejm 时间: 2010-4-5 21:30
U盘上的文件正在测试中。
22楼的代码利用了cmd窗口的一个特性:当把文件拖曳到cmd窗口的时候,会把文件名扩展到全路径,其中,带空格或&字符的路径会自动在首尾添加引号对;如果路径中不存在这些特殊字符,则不会带引号对。
由于for语句中,in和do之间是括号对,如何让for识别for自身的括号对和路径中的括号对,则是个十分难办的事情:当所有的路径都带有空格或&字符的时候,cmd会自动为每一条路径带上引号对,在for语句中不会出现问题;当不是所有的路径中都带有空格或&字符的时候,路径中引号对和非引号对的路径是混杂的,在for语句中,由于无法识别路径中的括号和for自身的括号,会造成for语句无法执行。
综上所述,并不是文件是不是位于U盘上的问题,而是每一个文件的完整路径中是否同时带有空格或&字符的问题。
作者: FOR 时间: 2010-4-5 22:15
我的xp sp2 无法处理含&符号的文件名
@echo off
echo %*
pause
遇到 c:\a&b 这样的文件夹就只显示 c:\a
作者: namejm 时间: 2010-4-5 22:53
原帖由 FOR 于 2010-4-5 22:15 发表
我的xp sp2 无法处理含&符号的文件名
@echo off
echo %*
pause
遇到 c:\a&b 这样的文件夹就只显示 c:\a
当路径中同时出现空格和&的时候,这段代码能正确执行;当路径中存在&而没有空格的时候,将会出错,把echo语句写成 echo "%*" 也不行。也就是说,cmd窗口在获取拖曳到它上面的文件路径的时候,存在一个bug:当路径中存在&而没有空格的时候,它会把&前后的字符串当做两个参数来传递,而不是只作为一个参数来看待。
作者: namejm 时间: 2010-4-5 23:03
绞尽脑汁写了一段代码,能兼容各种情况,唯有一种特殊情况解决不了:当文件的完整路径中存在&而没有空格的时候,无法正确获取文件路径。这可能是cmd窗口在获取or传递参数时的一个bug,有待各位给出合理的解释,并希望有高人能把它解决掉。
代码如下:- @echo off
- md d:\123 2>nul
- set str=%*
- set "str=%str:"=%"
- set "str= %str%"
- call set "str=%%str: %~d1=" "%~d1%%"
- for %%i in ("%str%") do (
- move /y "%%~i" d:\123 2>nul||(
- xcopy /e /s /k /o /q /y "%%~i" "d:\123\%%~nxi\" 2>nul&&rd /q /s "%%~i"
- )
- )
- pause
复制代码
这段代码最难处理的部分是如何获取文件的完整路径,总体思路是:先用 %* 来接收所有文件的完整路径(只带&而不带空格的不能正确接收),赋予变量str,把str中所有的引号去除,并以盘符作为分隔标志,在盘符前加上适当的引号对,最后,放到for语句中,这样,所有的路径最终会被在首尾加上引号对,从而避免for语句无法正确识别路径中的空格、&、括号等特殊字符的现象。
=============================
以上代码还有一种情况无法正确处理:
当文件路径中含有^符号的时候,^将会被直接丢弃。
——20100411补充
作者: FOR 时间: 2010-4-5 23:14
- @echo off
- call :loop %*
- echo %var%
- pause
- :loop
- set var=%var% "%~1"
- if not "%~2"=="" shift&goto loop
- goto :eof
复制代码
作者: namejm 时间: 2010-4-5 23:23
33楼的代码不能兼容路径中存在逗号、分号、等号、有&而没有空格这几种情况,最好还是把所有的路径都放到引号对中来处理。
作者: 523066680 时间: 2010-4-11 17:51 标题: 回复 34楼 的帖子
不对啊 我测试你的代码,是可以的
文件为a&dir.bat
重复某贴中那个代码- @echo off
- :a
- if not "%~1"=="" (copy "%~1" "d:\123\" &shift /1 &goto :a)
- pause
复制代码
33楼的代码不能允许百分号是真的;
寂寞老大的代码,是复制了以后还是显示复制了0个……
可能主题还没看出来 吃完饭再看……
[ 本帖最后由 523066680 于 2010-4-11 18:04 编辑 ]
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |