中国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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
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
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: