中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请各位高手帮个忙,看看这个批处理该怎么做?
作者:
标题: 请各位高手帮个忙,看看这个批处理该怎么做? 上一主题 | 下一主题
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『楼 主』:  请各位高手帮个忙,看看这个批处理该怎么做?

假定有一个目录AAA,里面有许多子目录a1、a2、a3……,每个子目录里都有N个名字 相同但内容不同的文件,比如a1.txt、a2.txt、a3.txt,现在我想对AAA目录进行备份, 备份目录可任意给定(比如BBB),但要求AAA里面的子目录结构不变,而且只要备份每个子目录里的 a1.txt、a2.txt、a3.txt文件 AAA |---a1 | |-----XXXX | |-----XXXX | |-----a1.txt | |-----a2.txt | |-----a3.txt | |---a2 | |-----XXXX | |-----XXXX | |-----a1.txt | |-----a2.txt | |-----a3.txt | |---a3 | |-----XXXX | |-----XXXX | |-----a1.txt | |-----a2.txt | |-----a3.txt | |---a4 |-----XXXX |-----XXXX |-----a1.txt |-----a2.txt |-----a3.txt 备份后的结构如下: BBB |---a1 | |-----a1.txt | |-----a2.txt | |-----a3.txt | |---a2 | |-----a1.txt | |-----a2.txt | |-----a3.txt | |---a3 | |-----a1.txt | |-----a2.txt | |-----a3.txt | |---a4 |-----a1.txt |-----a2.txt |-----a3.txt 请各位高手帮个忙,帮忙做个批处理文件。先谢谢大家了。


2006-8-14 13:07
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 2 楼』:  

如果单纯进行备份建议使用压缩备份Winrar或Pkzip @echo off start /wait WinRAR u -ep1 -r BBB AAA\*.TXT 或者 @echo off Pkzip -a -p -r BBB AAA\*.TXT


2006-8-14 13:38
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 3 楼』:  

补充另外一种目录结构 @echo off start /wait WinRAR u -es1 -r BBB AAA\*.TXT 或者 @echo off Pkzip -a -P -r BBB AAA\*.TXT 2楼和3楼压缩命令参数都要注意大小写


2006-8-14 13:48
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 4 楼』:  

  经过测试后可行的代码如下,此批处理可以放在任意位置:
@echo off
setlocal enabledelayedexpansion
cd /d "AAA的路径"
xcopy /i /s /t %cd% "BBB的路径"
for /r %%i in (.) do (
    set cur_root=%%~dfi
    set "new_root=!cur_root:AAA的路径=BBB的路径!"
    xcopy /y "!cur_root!\a1.txt" "!new_root!"
    xcopy /y "!cur_root!\a2.txt" "!new_root!"
    xcopy /y "!cur_root!\a3.txt" "!new_root!"
)
explorer "BBB的路径"
pause
[ Last edited by namejm on 2006-8-14 at 19:57 ]




尺有所短,寸有所长,学好CMD没商量。 考虑问题复杂化,解决问题简洁化。
2006-8-14 17:55
查看资料  发短消息  网志   编辑帖子  回复  引用回复
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『第 5 楼』:  

苦恼啊,楼上的兄弟,你的方法满足不了我的要求,麻烦你再辛苦一下!


2006-8-14 17:59
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 6 楼』:  

  忘了说了,这段代码要放在目录AAA下执行。你再试一下看行不行。




尺有所短,寸有所长,学好CMD没商量。 考虑问题复杂化,解决问题简洁化。
2006-8-14 18:03
查看资料  发短消息  网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 7 楼』:  

压缩备份方式不好吗?xcopy 应该没那么复杂 @echo off xcopy /e /h /r /y .\aaa\*.txt .\bbb\ 或者 @echo off FOR %%A IN (a1 a2 a3) DO xcopy /e /h /r /y .\aaa\%%A.txt .\bbb\


2006-8-14 18:39
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『第 8 楼』:  

Originally posted by namejm at 2006-8-14 17:55:   试试下面的代码,可能会有用(未经测试,有问题请反馈,但不至于破坏原始数据): [code] @echo off setlocal enabledelayedexpansion for /r %%i in (.) do ( ... 『第 6 楼』:   忘了说了,这段代码要放在目录AAA下执行。你再试一下看行不行。
老兄或者老弟,不行。显示“分析错误” [ Last edited by jtyuer on 2006-8-14 at 19:19 ]


2006-8-14 19:18
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『第 9 楼』:  

Originally posted by fastslz at 2006-8-14 18:39: 压缩备份方式不好吗?xcopy 应该没那么复杂 @echo off xcopy /e /h /r /y .\aaa\*.txt .\bbb\ 或者 @echo off FOR %%A IN (a1 a2 a3) DO xcopy /e /h /r /y .\aaa\%%A.txt .\bbb\
根据提示,适当修改,已完成。 谢谢各位老大,谢谢!


2006-8-14 19:42
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 10 楼』:  

Originally posted by fastslz at 2006-8-14 18:39: 压缩备份方式不好吗?xcopy 应该没那么复杂 @echo off xcopy /e /h /r /y .\aaa\*.txt .\bbb\ 或者 @echo off FOR %%A IN (a1 a2 a3) DO xcopy /e /h /r /y .\aaa\%%A.txt .\bbb\
  如果要用xcopy的话,不会那么简单的,因为楼主要求复制的是每个子目录中的a1.txt、a2.txt和a3.txt这三个文件,并且要求bbb的目录可以任意指定。观察兄这两段代码,第一段代码只是把所有的txt文件都复制到与aaa文件夹的同一目录的bbb文件夹下,而第二段虽然只复制了那三个文件,但是只能复制到同一目录下的bbb文件夹下,这两段代码共同的缺憾就是不能任意指定bbb文件夹的位置。   修改后的代码在4楼,原来的代码没有经过测试,导致有些笔误和疏漏。请楼主再测试一下。




尺有所短,寸有所长,学好CMD没商量。 考虑问题复杂化,解决问题简洁化。
2006-8-14 20:04
查看资料  发短消息  网志   编辑帖子  回复  引用回复
jtyuer
初级用户





积分 73
发帖 29
注册 2006-8-13
状态 离线
『第 11 楼』:  

Originally posted by namejm at 2006-8-14 20:04:   如果要用xcopy的话,不会那么简单的,因为楼主要求复制的是每个子目录中的a1.txt、a2.txt和a3.txt这三个文件,并且要求bbb的目录可以任意指定。 ...
按照老大给的方法试验了一下,不理想,在BBB目录中拷贝了所需要的文件的同时,也把AAA里面的其它孙目录(子目录的子目录。不知这样称呼对不对?)搬到BBB目录中了 自己鼓捣了一整天,终于做出了一个,还成,基本满足了我的要求,贴出来老大帮我分析一下,看看还能不能简练些?主要是自己做WindowsXP OEM 20合一的盘用,以前光靠手动提取、拷贝文件让人心烦,而且容易出错 我自己瞎鼓捣的东东: @Echo Off Set TT=WindowsXP OEM文件提取复制工具 COLOR 1F TITLE %TT% :start CLS Echo. Echo ╭══════════════════╮ Echo ║ ║ Echo ╭═══┤ WindowsXP OEM文件提取复制工具 ├═══╮ Echo ║ ║ ║ ║ Echo ║ ╰══════════════════╯ ║ Echo ║ ║ Echo ║ 您是要从光盘或硬盘中提取OEM文件呢? ║ Echo ║ 还是想拷贝现有的OEM文件到硬盘中? ║ Echo ║ ║ Echo ║ [1] 从光盘或硬盘中提取OEM文件 ║ Echo ║ [2] 拷贝现有的OEM文件到硬盘中 ║ Echo ║ [3] 从光盘或硬盘中提取OEM图标 ║ Echo ║ [4] 拷贝现有的OEM图标到硬盘中 ║ Echo ║ [Q] 退出 ║ Echo ║ ║ Echo ╟──────────────────────────╢ Echo ║ 注:1. 根据提示自行输入光盘或硬盘文件目录的绝对路径║ Echo ║ 2. 文件所在路径不允许有空格。 ║ Echo ╟══════════════════════════╢ Echo ║ 版权所有:jtyuer 供网友们交流研究,翻版不究 ║ Echo ╰──────────────────────────╯ Echo. Set Choice= Set /P Choice= 请选择要进行的操作(1/2/3/4/Q),然后按回车: If Not '%Choice%'=='' SET Choice=%Choice:~0,1% If /I '%Choice%'=='1' GOTO funa If /I '%Choice%'=='2' GOTO funa If /I '%Choice%'=='3' GOTO funa If /I '%Choice%'=='4' GOTO funa If /I '%Choice%'=='Q' EXIT Goto start :funa If /I '%Choice%'=='1' ( TITLE %TT% - 从光盘或硬盘中提取OEM文件 ) If /I '%Choice%'=='2' ( TITLE %TT% - 拷贝现有的OEM文件到硬盘中 Goto funb ) If /I '%Choice%'=='3' ( TITLE %TT% - 拷贝现有的OEM图标到硬盘中 Goto func ) If /I '%Choice%'=='4' ( TITLE %TT% - 拷贝现有的OEM图标到硬盘中 Goto fund ) If "%Err%"=="" ( CLS ) :funa1 cls Echo 请输入OEM文件所在的目录名,如c:\1234 Echo. Echo 输入路径时不包括i386子目录路径 echo. Set input= Set /P input= 输入路径: If "%input%"=="" Goto funa If Not Exist %input% ( Set Err=1 Echo. CLS Echo 您所输入的OEM文件目录路径不正确,请重新输入 Echo. Goto :funa1 ) ::funa2 cls Echo 请输入保存OEM文件的目录名,如d:\1234 echo. Set output= Set /P output= 输入路径: If "%input%"=="" Goto funa1 If Not Exist %output% ( Set Err=1 Echo. CLS Echo 保存OEM文件的目录%output%不存在,自动建立%output%目录 Echo. Echo. Echo. @md %output% ) :Copy @Echo dpcdll.dl_>%temp%\oem.txt @Echo oembios.bi_>>%temp%\oem.txt @Echo oembios.ca_>>%temp%\oem.txt @Echo oembios.da_>>%temp%\oem.txt @Echo oembios.si_>>%temp%\oem.txt @Echo pidgen.dll>>%temp%\oem.txt @Echo setupp.ini>>%temp%\oem.txt @Echo winnt.sif>>%temp%\oem.txt for /f %%a in ('dir /ad /b %input%') do md %output%\%%a\i386 & FOR /f %%b in (%temp%\oem.txt) do copy /y %input%\%%a\i386\%%b %output%\%%a\i386\ Goto Exit :funb cls Echo 请输入OEM文件所在的目录名,如c:\1234 Echo. Echo 输入路径时不包括i386子目录路径 echo. Set input= Set /P input= 输入路径: If "%input%"=="" Goto funb If Not Exist %input% ( Set Err=1 Echo. CLS Echo 您所输入的OEM文件目录路径不正确,请重新输入 Echo. Goto funb ) :funb1 cls Echo 请输入要拷贝OEM文件的目录名,如d:\1234 echo. Set output= Set /P output= 输入路径: If "%input%"=="" Goto funb1 If Not Exist %output% ( Set Err=1 Echo. CLS Echo 保存OEM文件的目录%output%不存在,自动建立%output%目录 Echo. Echo. @md %output% ) :Copy For /f %%m In ('dir /ad /b %input%') do md %output%\%%m\i386 & Copy /y %input%\%%m\i386\*.* %output%\%%m\i386\ Goto Exit :func cls Echo 请输入OEM图标所在的目录名,如c:\1234 Echo. Set input= Set /P input= 输入路径: If "%input%"=="" Goto func If Not Exist %input% ( Set Err=1 Echo. CLS Echo 您所输入的OEM图标目录路径不正确,请重新输入 Echo. Goto func ) :func1 cls Echo 请输入要拷贝OEM图标的目录名,如d:\1234 echo. Set output= Set /P output= 输入路径: If "%input%"=="" Goto funb1 If Not Exist %output% ( Set Err=1 Echo. CLS Echo 保存OEM图标的目录%output%不存在,自动建立%output%目录 Echo. Echo. @md %output% ) :Copy If Exist %temp%\ml.txt Del %temp%\ml.txt If Exist %temp%\oem.txt Del %temp%\oem.txt @Echo oeminfo.ini>%temp%\oem.txt @Echo oemlogo.bmp>>%temp%\oem.txt for /f %%a in ('dir /ad /b %input%') do md %output%\%%a\$OEM$\$$\SYSTEM32 & FOR /f %%b in (%temp%\oem.txt) do copy /y %input%\%%a\$OEM$\$$\SYSTEM32\%%b %output%\%%a\$OEM$\$$\SYSTEM32\ Goto Exit :fund cls Echo 请输入OEM图标所在的目录名,如c:\1234 Echo. Set input= Set /P input= 输入路径: If "%input%"=="" Goto fund If Not Exist %input% ( Set Err=1 Echo. CLS Echo 您所输入的OEM图标所在的目录路径不正确,请重新输入 Echo. Goto fund ) :fund1 cls Echo 请输入要拷贝OEM图标的目录名,如d:\1234 echo. Set output= Set /P output= 输入路径: If "%input%"=="" Goto fund1 If Not Exist %output% ( Set Err=1 Echo. CLS Echo 保存OEM文件的目录%output%不存在,自动建立%output%目录 Echo. @md %output% ) :Copy For /f %%m In ('dir /ad /b %input%') do md %output%\%%m\$OEM$\$$\SYSTEM32 & Copy /y %input%\%%m\$OEM$\$$\SYSTEM32\*.* %output%\%%m\$OEM$\$$\SYSTEM32\ Goto Exit :Exit CLS Echo. Echo ╭══════════════════╮ Echo ║ ║ Echo ╭═══┤ WindowsXP OEM文件提取复制工具 ├═══╮ Echo ║ ║ ║ ║ Echo ║ ╰══════════════════╯ ║ Echo ║ ║ Echo ║ 您需要的操作已经完成,请核查. . . ║ Echo ║ 感谢您的使用! ║ Echo ║ 你还准备继续拷贝文件吗? ║ Echo ║ ║ Echo ║ ║ Echo ║ [Y] 继续拷贝文件 ║ Echo ║ ║ Echo ║ [N] 退出 ║ Echo ║ ║ Echo ╟──────────────────────────╢ Echo ║ 注:1. 根据提示自行输入光盘或硬盘文件目录的绝对路径║ Echo ║ 2. 文件所在路径不允许有空格。 ║ Echo ╟══════════════════════════╢ Echo ║ 版权所有:jtyuer 供网友们交流研究,翻版不究 ║ Echo ╰──────────────────────────╯ Echo. Set Choice= Set /P Choice= 请选择要进行的操作(y/n),然后按回车: If Not '%Choice%'=='' SET Choice=%Choice:~0,1% If /I '%Choice%'=='y' GOTO start If /I '%Choice%'=='n' GOTO end Goto Exit :End


2006-8-14 21:06
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 12 楼』:  

Originally posted by jtyuer at 2006-8-14 21:06: 按照老大给的方法试验了一下,不理想,在BBB目录中拷贝了所需要的文件的同时,也把AAA里面的其它孙目录(子目录的子目录。不知这样称呼对不对?)搬到BBB目录中了
  看了你在顶楼的帖子,你AAA目录下的子目录只有一层啊,你也没有说子目录下还有子目录的,汗一个先。请把AAA的完整目录结构、你想要的目录和文件帖出来再说吧,再没弄明白你准确的需求前,没有谁的代码是对的。




尺有所短,寸有所长,学好CMD没商量。 考虑问题复杂化,解决问题简洁化。
2006-8-15 08:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 13 楼』:  

Re jtyuer『第 11 楼』:   你这段代码确实有可再精简的地方,并且还有几处错误。现略举一二:   1、“文件所在路径不允许有空格。”其实没必要如此苛刻,路径也可以带空格的,只要把路径用引号括起来就行了;   2、If Not '%Choice%'=='' SET Choice=%Choice:~0,1%一句中,if语句多余,只保留set语句就可以了;   3、If /I '%Choice%'=='1' GOTO funa一句中,/I 没必要,而在If /I '%Choice%'=='Q' EXIT中应该保留,具体原因,你多想两次就明白了;   4、:funa段中,If "%Err%"=="" 语句中的%Err%不知从何而来;   5、:funa1段中,goto :funa1的语句是错误的;令我感到奇怪的是,:funa1、:funa2和以下的:funb1等段,前面并没有明确地指出有跳转到该段的语句,它们会得到执行吗?   6、:Copy段的标号取名不当,和CMD命令中的copy重合了,一旦要用跳转语句goto copy,还真不知道会有什么结果呢(我这里尚未测试),即使不会发生什么意外,但是把标号名取得和命令名一模一样的做法,不可取;   7、
@Echo dpcdll.dl_>%temp%\oem.txt
@Echo oembios.bi_>>%temp%\oem.txt
@Echo oembios.ca_>>%temp%\oem.txt
@Echo oembios.da_>>%temp%\oem.txt
@Echo oembios.si_>>%temp%\oem.txt
@Echo pidgen.dll>>%temp%\oem.txt
@Echo setupp.ini>>%temp%\oem.txt
@Echo winnt.sif>>%temp%\oem.txt
这段的@符号完全没必要,可精简为:
(Echo dpcdll.dl_
Echo oembios.bi_
Echo oembios.ca_
Echo oembios.da_
Echo oembios.si_
Echo pidgen.dll
Echo setupp.ini
Echo winnt.sif)>%temp%\oem.txt
  8、:funa这段的功能只是把CMD窗口的标题改变了,其实只要把改变的标题做到相应的段里就可以了,感觉这段代码没存在的必要。   罗罗嗦嗦谈了好几点,希望你针对具体需求作相应变动,精简工作大有可为




尺有所短,寸有所长,学好CMD没商量。 考虑问题复杂化,解决问题简洁化。
2006-8-15 08:54
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: