中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批量复制多个文件夹到相应的文件夹中
作者:
标题: 批量复制多个文件夹到相应的文件夹中 上一主题 | 下一主题
prcgolf
新手上路





积分 19
发帖 13
注册 2006-11-25
状态 离线
『楼 主』:  批量复制多个文件夹到相应的文件夹中

现有一文件夹
f:\alog

其下有多个子文件夹
每个子文件夹下都有名称为0的文件夹,有的还可能有名称为1 或2 或3的文件夹(也可能同时包含这三个,个数不定)
这些名称为0 或1 或2 或3 的文件夹都会有相应的_bak文件夹
比如会有0_bak 或1_bak 等等

现在要想实现备份功能,即将不带_bak的文件夹中的所有.log文件复制到相应的另一个文件夹中去(z:\logbak),若存在同名文件则覆盖。
比如:

copy /y f:\alog\sina\0\*.log z:\logbak\sina\bak\0\
copy /y f:\alog\sina\1\*.log z:\logbak\sina\bak\1\
copy /y f:\alog\sina\3\*.log z:\logbak\sina\bak\3\

copy /y f:\alog\sohu\0\*.log z:\logbak\sohu\bak\0\
copy /y f:\alog\sohu\2\*.log z:\logbak\sohu\bak\2\

等等
(注意中间加了一个bak文件夹)

但象这样的文件夹中的log则不复制:
f:\alog\sina\0_bak\*.log
f:\alog\sina\1_bak\*.log
f:\alog\sina\3_bak\*.log

f:\alog\sohu\0_bak\*.log
f:\alog\sohu\2_bak\*.log


如何用批处理实现上面的批量拷贝功能,
谢谢诸位大侠

2007-9-19 16:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 2 楼』:  

楼主这句话真的不好理解:

(也可能同时包含这三个,个数不定)

是什么含义呢,是否包含
f:\alog\sina\12
f:\alog\sina\01
f:\alog\sina\123

这些文件呢,又或是还包含

f:\alog\sina\4
f:\alog\sina\5
......
f:\alog\sina\12
f:\alog\sina\13
......
f:\alog\sina\123
f:\alog\sina\124
......

2007-9-19 23:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wzggig
新手上路





积分 2
发帖 1
注册 2007-9-20
状态 离线
『第 3 楼』:  

(也可能同时包含这三个,个数不定)

楼主的意思应该是有的可能同时包含名称为1、2、3的文件夹,甚至更多,比如名称为4、5、6。但不管这种文件有几个,该文件夹内都包含一个名为0的文件。

2007-9-20 06:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
prcgolf
新手上路





积分 19
发帖 13
注册 2006-11-25
状态 离线
『第 4 楼』:  

我是楼主,wzggig的说法是对的

2007-9-20 11:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
prcgolf
新手上路





积分 19
发帖 13
注册 2006-11-25
状态 离线
『第 5 楼』:  

关键是没有这样的语法:
dir /b /ad /s f:\alog\*\0

2007-9-20 12:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by prcgolf at 2007-9-20 12:37:
关键是没有这样的语法:
dir /b /ad /s f:\alog\*\0

你想列出哪些路径呢?

2007-9-20 13:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 7 楼』:  

这么说并不是不好操作了

如果有文件夹0 1 2 3 4 5 ....最多到10

@echo off&setlocal EnableDelayedexpansion
set num=0
:begin
for /d /r "d:\alog\" %%a in (!num!) do if exist "%%a" set path1=%%a&(md "z:\alog\!path1:~8,-2!

\bak\!num!")&&(copy /y "!path1!\*.log" "z:\alog\!path1:~8,-2!\bak\!num!\")||echo Z盘不可写
set /a num+=1
if not num==10 goto begin
pause


不知附合楼主意否?

2007-9-20 13:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
prcgolf
新手上路





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

to:lxmxn

想列出这样的:

f:\alog\sina\0\*.log
f:\alog\sina\1\*.log
f:\alog\sina\3\*.log
f:\alog\sohu\0\*.log
f:\alog\sohu\2\*.log

2007-9-20 13:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 9 楼』:  

for语句较长,其中md "z:\alog\!path1:~8,-2!\bak\!num!" 是创建文件夹,完整的一句不是回车,由于论坛回复的原因产生了回车,注意修正。 

再发一次代码:

@echo off&setlocal EnableDelayedexpansion
set num=0
:begin
for /d /r "d:\alog\" %%a in (!num!) do if exist "%%a" set path1=%%a&(md "z:\alog\!path1:~8,-2!\bak\!num!")&&(copy /y "!path1!\*.log" "z:\alog\!path1:~8,-2!\bak\!num!\")||echo Z盘不可写
set /a num+=1
if not num==10 goto begin
pause

以上代码 copy /y "!path1!\*.log" 是完整的一句,中间没有回车

干脆上传附件

附件 1: bak.txt (2007-9-20 14:04, 295 bytes,下载次数: 12)
2007-9-20 14:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
prcgolf
新手上路





积分 19
发帖 13
注册 2006-11-25
状态 离线
『第 10 楼』:  

首先谢谢lp1129
能讲解一下吗?我对批处理真的不懂,多谢

2007-9-20 14:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 11 楼』:  

你可以查看此贴

http://www.cn-dos.net/forum/viewthread.php?tid=33691&fpage=1

lxmxn版主对这样的情况讲的非常清楚

2007-9-20 14:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
prcgolf
新手上路





积分 19
发帖 13
注册 2006-11-25
状态 离线
『第 12 楼』:  

多谢两位大侠,现在还有两个问题没有解决。
1.源文件夹f:\alog 如何做成参数传递过来,因为牵涉到:~8,-2的问题,参数不一样,长度可能不一样,8就不是固定的了,这个该怎么解决??
2.想控制文件夹层次,因为源文件夹中可能会有类似的文件夹:
f:\alog\0\
f:\alog\6\
f:\alog\sina\0\7\

象这样的文件夹我不想复制,只想复制我上面所说的那种情况,即:
f:\alog\sina\0
f:\alog\sina\1
f:\alog\sina\3

这些文件夹下的.log文件。(只要纯数字文件夹是源文件夹下第二层子文件夹)
这个层次又该怎么控制。

多谢!!

2007-9-20 17:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 13 楼』:  

lxmxn版主的具体问题具体分析,让我跳出批处理编程复杂化的怪圈,批处理不是万能的,只有在特定情况,解决一些特定的问题,所以楼主也应该具体问题具体分析!

对于楼上又提出的问题,我们还可以用变量截取法加以控制

f:\alog\sina\0
f:\alog\sina\1
f:\alog\sina\3

对于这样的具体问题有一个特点,那就是它的sina目录“如果”固定是四个数字,那么可以对变量path1再设一个条件

if "%path1:~,-7%"=="f:\alog" 执行命令

又如果sina目录不是四个字母,就从f:\alog\ 和\0 来分析

对于f:\alog\sina\0路径,   %path1:~8,-2%      得到的是sina或sina1等文件夹名,不包含\
对于f:\alog\0路径      %path1:~8,-2%   得到空
对于f:\alog\sina\0\7路径   %path1:~8,-2%      得到是sina\0,一定包含\

这样我们先过滤为空的情况 if #%path1:~8,-2%==# goto end

再过滤含有\的情况    echo %path1:~8,-2%|findstr \ &&goto end

2007-9-20 21:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
prcgolf
新手上路





积分 19
发帖 13
注册 2006-11-25
状态 离线
『第 14 楼』:  

to:lp1129
多谢!!

能否写个完整点的批处理
另外怎么取得参数的长度,如果参数为空,则为当前文件夹路径

谢了

2007-9-21 12:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 15 楼』:  

@echo off&setlocal EnableDelayedexpansion
set num=0
:begin
for /d /r "f:\alog\" %%a in (!num!) do if exist "%%a" set path1=%%a&call :kkk
set /a num+=1
if not num==10 goto begin
pause&exit
:kkk
if #!path1:~8,-2!==# goto :eof
echo !path1:~8,-2!|findstr \ >nul&&goto :eof
(md "z:\alog\!path1:~8,-2!\bak\!num!")&&(copy /y "!path1!\*.log" "z:\alog\!path1:~8,-2!\bak\!num!\")||echo Z盘不可写
goto :eof

[ Last edited by lp1129 on 2007-9-21 at 04:16 PM ]

2007-9-21 16:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: