中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-21 08:59
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批量复制多个文件夹到相应的文件夹中 查看 1,739 回复 14
楼 主 批量复制多个文件夹到相应的文件夹中 发表于 2007-09-19 16:19 ·  中国 北京 鹏博士BGP
新手上路
积分 19
发帖 13
注册 2006-11-25 02:25
19年会员
UID 71639
性别 男
状态 离线
现有一文件夹
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


如何用批处理实现上面的批量拷贝功能,
谢谢诸位大侠
2 发表于 2007-09-19 23:23 ·  中国 陕西 渭南 电信
初级用户
★★
积分 186
发帖 92
注册 2007-03-27 08:20
19年会员
UID 83047
性别 男
状态 离线
楼主这句话真的不好理解:

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

是什么含义呢,是否包含
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
......
3 发表于 2007-09-20 06:16 ·  中国 山东 烟台 电信
新手上路
积分 2
发帖 1
注册 2007-09-20 05:36
18年会员
UID 97845
性别 男
状态 离线
(也可能同时包含这三个,个数不定)

楼主的意思应该是有的可能同时包含名称为1、2、3的文件夹,甚至更多,比如名称为4、5、6。但不管这种文件有几个,该文件夹内都包含一个名为0的文件。
4 发表于 2007-09-20 11:45 ·  中国 北京 鹏博士BGP
新手上路
积分 19
发帖 13
注册 2006-11-25 02:25
19年会员
UID 71639
性别 男
状态 离线
我是楼主,wzggig的说法是对的
5 发表于 2007-09-20 12:37 ·  中国 北京 鹏博士BGP
新手上路
积分 19
发帖 13
注册 2006-11-25 02:25
19年会员
UID 71639
性别 男
状态 离线
关键是没有这样的语法:
dir /b /ad /s f:\alog\*\0
6 发表于 2007-09-20 13:05 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by prcgolf at 2007-9-20 12:37:
关键是没有这样的语法:
dir /b /ad /s f:\alog\*\0

你想列出哪些路径呢?
7 发表于 2007-09-20 13:51 ·  中国 陕西 渭南 电信
初级用户
★★
积分 186
发帖 92
注册 2007-03-27 08:20
19年会员
UID 83047
性别 男
状态 离线
这么说并不是不好操作了

如果有文件夹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


不知附合楼主意否?
8 发表于 2007-09-20 13:52 ·  中国 北京 鹏博士BGP
新手上路
积分 19
发帖 13
注册 2006-11-25 02:25
19年会员
UID 71639
性别 男
状态 离线
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
9 发表于 2007-09-20 14:04 ·  中国 陕西 渭南 电信
初级用户
★★
积分 186
发帖 92
注册 2007-03-27 08:20
19年会员
UID 83047
性别 男
状态 离线
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" 是完整的一句,中间没有回车

干脆上传附件
附件
bak.txt (295 bytes, 下载次数: 12)
10 发表于 2007-09-20 14:07 ·  中国 北京 鹏博士BGP
新手上路
积分 19
发帖 13
注册 2006-11-25 02:25
19年会员
UID 71639
性别 男
状态 离线
首先谢谢lp1129
能讲解一下吗?我对批处理真的不懂,多谢
11 发表于 2007-09-20 14:50 ·  中国 陕西 渭南 电信
初级用户
★★
积分 186
发帖 92
注册 2007-03-27 08:20
19年会员
UID 83047
性别 男
状态 离线
你可以查看此贴

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

lxmxn版主对这样的情况讲的非常清楚
12 发表于 2007-09-20 17:36 ·  中国 北京 鹏博士BGP
新手上路
积分 19
发帖 13
注册 2006-11-25 02:25
19年会员
UID 71639
性别 男
状态 离线
多谢两位大侠,现在还有两个问题没有解决。
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文件。(只要纯数字文件夹是源文件夹下第二层子文件夹)
这个层次又该怎么控制。

多谢!!
13 发表于 2007-09-20 21:58 ·  中国 陕西 渭南 电信
初级用户
★★
积分 186
发帖 92
注册 2007-03-27 08:20
19年会员
UID 83047
性别 男
状态 离线
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
14 发表于 2007-09-21 12:04 ·  中国 北京 鹏博士BGP
新手上路
积分 19
发帖 13
注册 2006-11-25 02:25
19年会员
UID 71639
性别 男
状态 离线
to:lp1129
多谢!!

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

谢了
15 发表于 2007-09-21 16:14 ·  中国 陕西 渭南 电信
初级用户
★★
积分 186
发帖 92
注册 2007-03-27 08:20
19年会员
UID 83047
性别 男
状态 离线
@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 ]
论坛跳转: