
标题: [文件操作] 【已结】批处理如何把指定名字的文件所在的文件夹自动复制到U盘 [打印本页]
作者: yiweipiaoxu 时间: 2008-9-30 01:04 标题: 【已结】批处理如何把指定名字的文件所在的文件夹自动复制到U盘
研究了好久,一直没能写出来,在网上找了些功能类似的程序进行研究,进展也不大。请各位朋友帮帮忙,谢谢!
作者: yiweipiaoxu 时间: 2008-9-30 01:07
补充一下,我想让这段程序实现的功能是:让其自动搜索“cstrike.exe”这个文件,并把这个文件所在的文件夹(名字是CS1.6,但是事先并不知道这个文件夹的名字),整个复制到正插在电脑上的U盘里。
作者: pusofalse 时间: 2008-9-30 09:39
- @echo off
- :recur
- for /f "delims=驱动器:\ " %%a in ('fsutil fsinfo drives^|more') do (
- fsutil fsinfo drivetype %%a:|findstr %a% "可移动">nul&&(
- if not defined a (
- set "a=/v"&call :recur "%%a"
- ) else (
- for /f "delims=" %%i in ('dir /b /s %%a:\cstrike.exe') do (
- copy "%%~dpi" "%~1:\"
- ))))
- if "%~1" neq "" pause
- exit/b
复制代码
未测试。
作者: yiweipiaoxu 时间: 2008-9-30 17:06
非常感谢斑竹的热心帮助~刚才我测试了一下,没成功。出现“驱动器未就绪”的错误提示窗口,不懂是哪里出了问题,请知道的朋友再指点和修改一下,谢谢!
作者: zqz0012005 时间: 2008-9-30 18:14
- @echo off
- for /f "delims=驱动器:\ " %%a in ('fsutil fsinfo drives^|more') do (
- fsutil fsinfo drivetype %%a:|find "可移动">nul && set u=%%a
- if not defined u (
- if not defined cs for /f "delims=" %%i in ('dir /b /s %%a:\cstrike.exe 2^>nul') do set cs=%%~dpi
- )
- )
- xcopy /s/e/h/c/k/i "%cs%" %u%:\cs
- echo.&pause
复制代码
作者: pusofalse 时间: 2008-9-30 18:30
驱动器未就绪,应该是你的U盘问题吧,或者是连接问题。
----------------------------------------------------------------------
现在才知copy不能复制文件夹,请用ZQZ版主的代码。
[ 本帖最后由 pusofalse 于 2008-9-30 19:28 编辑 ]
作者: yiweipiaoxu 时间: 2008-9-30 19:27
55555.。。。。。。换了U盘了,还是不成功。U盘肯定没有问题的~麻烦大家自己测试一下看看问题再哪好吗......55555555.......
作者: pusofalse 时间: 2008-9-30 19:30 标题: 回复 7楼 的帖子
zqz版主的代码也不行吗,运行批处理,把结果信息贴上来。
作者: 随风 时间: 2008-10-1 01:24
两位斑竹忽略了一个问题、
"%%~dpi" 这一句得到的是批处理所在盘的盘符,而不是实际文件所在的盘符。
所以会运行不正确。
仓促之间写的,代码未做优化。。。
完善代码见 11 楼
- @echo off
- :loop
- set str=&set "u="
- for /f "delims=驱动器:\ " %%a in ('fsutil fsinfo drives^|more') do (
- fsutil fsinfo drivetype %%a:|findstr "可移动">nul&&set "u=%%a"
- call set str=%%str%% %%a
- )
- set str=%str:~0,-1%
- if not defined u goto loop
- for %%a in (%str%) do (
- cd/d %%a:
- for /r %%i in ("cstrike.exe") do if exist "%%i" set "wjj=%%i"
- )
- set wjj=%wjj:"=%
- call :loop_1 "%wjj%"
- echo "%ok:~1%"
- xcopy /s/e/h/c/k/i "%ok:~1%" "%u%:\aaa\"
- start "" "%u%:\aaa"
- exit
- :loop_1
- for /f "tokens=1* delims=\" %%a in ("%~1") do (
- if not "%%b"=="" call set ok=%%ok%%\%%a&call :loop_1 "%%b"
- )
- goto :eof
复制代码
[ 本帖最后由 随风 于 2008-10-1 11:38 编辑 ]
作者: pusofalse 时间: 2008-10-1 06:22 标题: 回复 9楼 的帖子
不解~
for /f "delims=" %%i in ('dir /b /s %%a:\cstrike.exe') do copy "%%~dpi" "%~1:\"
这样一句中的%%~dpi确实应该是文件所在的路径,请随风兄赐教~
作者: 随风 时间: 2008-10-1 10:37
全盘搜索指定文件,并复制文件所在的父文件夹到 U 盘 aaa 文件夹内。
完整代码
全盘搜索 e n.txt 文件(有可能不止一个)把所有 e n.txt文件所在的父文件夹复制到 U 盘 aaa文件夹内。
注意 e n.txt 文件不能在根目录。
测试通过。。。- @echo off&setlocal EnableDelayedExpansion
- set x=e n.txt
- :start
- set str=&set u=&cls&color 1f
- echo.&echo 正在检测 u 盘是否插入。。。
- for /f "delims=驱动器:\ " %%a in ('fsutil fsinfo drives^|more') do (
- fsutil fsinfo drivetype %%a:|find/i "可移动驱动器" >nul&&set "u=%%a"
- set str=!str! %%a
- )
- if not defined u (
- cls&echo.&color cf
- echo 检测到 u 盘未插入,请插入 u 盘后,按任意键继续。。。
- pause>nul&goto start
- )
- set str=%str:~0,-1%
- for %%a in (%str%) do (
- cd/d %%a:
- for /r %%b in ("%x%") do (
- if exist "%%b" (
- set /a n+=1
- set var=%%b&set var=!var:"=!
- call :loop "!var!"
- call set wjj!n!=%%wjj!n!:~1%%
- )))
- for /l %%a in (1 1 %n%) do (
- for /f "delims=" %%b in ("!wjj%%a!") do set "mb=%%~nxb"
- xcopy /e/y/h/r "!wjj%%a!" "%u%:\aaa\!mb!\"
- )
- start "" "%u%:\aaa"
- exit
- :loop
- for /f "tokens=1* delims=\" %%i in ("%~1") do (
- if "%%j"=="" goto :eof
- set wjj!n!=!wjj%n%!\%%i
- call :loop "%%j"
- )
- goto :eof
复制代码
作者: 随风 时间: 2008-10-1 11:03
确实是我疏忽了,你的这句没问题。
但你的代码有几个问题
1,copy 不能复制文件夹
2,遍厉文件,dir远没有 for /r 快,当文件多,且层次深时,更是明显。
3,你的%a%没有开启 延迟
4,你的代码要运行 fsutil 命令两次,是否会影响效率呢?感觉 fsutil 挺费时的
zq0012005 的代码应该这句出了问题
xcopy /s/e/h/c/k/i "%cs%" %u%:\cs
"%cs%" 后面多了个 \
%u%:\cs 后面少了个 \
改为 xcopy /s/e/h/c/k/i "%cs:~0,-1%" %u%:\cs\ 应该就可以了,我也没测试,只是看代码猜的,不知道对不对,你有时间测试一下吧。
[ 本帖最后由 随风 于 2008-10-1 11:06 编辑 ]
作者: pusofalse 时间: 2008-10-1 11:32 标题: 回复 12楼 的帖子
我昨天刚刚知道copy不能复制文件夹~受教!~
另,测试不必开启延迟,%a%也会正确扩展,call了一个子过程,虽然是call自身,但还是相当于跳出了循环~测试以下代码便知:- @echo off
- set "str=echo batch&echo bbs.bathome.net"
- :lp
- for %%i in (test) do (
- (%str%)|findstr %a% "batch"
- if not defined a set "a=/v"&call :lp a
- )
- if "%~1" equ "" pause
- set a=
复制代码
作者: zqz0012005 时间: 2008-10-1 18:22 标题: 回复 12楼 的帖子
多谢随风兄指正,以前没有注意到这些细节:xcopy的source文件夹末尾不能加\ ,但destination文件夹末尾加\或不加都可以
7楼代码完善如下- @echo off & setlocal EnableDelayedExpansion
- for /f "delims=驱动器:\ " %%a in ('fsutil fsinfo drives^|more') do (
- if not defined u (fsutil fsinfo drivetype %%a:|find "可移动">nul && set u=%%a)
- if not defined cs if /i %%a neq !u! (
- pushd %%a:\
- for /r %%i in (cstrike.exe) do if exist "%%i" set cs=%%~dpi
- popd
- )
- )
- if not defined u (echo U盘未插入!) else xcopy /s/e/h/c/k/i "%cs:~,-1%" %u%:\cs
- echo.&pause
复制代码
另外,%%~dpi确实应该是文件所在的路径,兄是不是记错了?%~dp0才是批处理所在文件夹
[ 本帖最后由 zqz0012005 于 2008-10-13 11:27 编辑 ]
作者: ningxy 时间: 2009-3-2 23:49
我也问过类似于这样的问题, 也来看下 学下
作者: Batcher 时间: 2009-3-3 00:02 标题: 回复 15楼 的帖子
看看就行了,把老帖翻上来是不太好的。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |