中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-05 21:18
48,039 主题排行 / 350,124 发帖 / 今日 2 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » 批量复制多个文件夹到相应的文件夹中
可打印版本  1,767 / 14
第1楼 prcgolf 发表于 2007-09-19 16:19
新手上路 发帖 13 积分 19
批量复制多个文件夹到相应的文件夹中
现有一文件夹
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楼 lp1129 发表于 2007-09-19 23:23
初级用户 发帖 92 积分 186
楼主这句话真的不好理解:

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

是什么含义呢,是否包含
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楼 wzggig 发表于 2007-09-20 06:16
新手上路 发帖 1 积分 2
(也可能同时包含这三个,个数不定)

楼主的意思应该是有的可能同时包含名称为1、2、3的文件夹,甚至更多,比如名称为4、5、6。但不管这种文件有几个,该文件夹内都包含一个名为0的文件。
第4楼 prcgolf 发表于 2007-09-20 11:45
新手上路 发帖 13 积分 19
我是楼主,wzggig的说法是对的
第5楼 prcgolf 发表于 2007-09-20 12:37
新手上路 发帖 13 积分 19
关键是没有这样的语法:
dir /b /ad /s f:\alog\*\0
第6楼 lxmxn 发表于 2007-09-20 13:05
版主 发帖 4,938 积分 11,386
Originally posted by prcgolf at 2007-9-20 12:37:
关键是没有这样的语法:
dir /b /ad /s f:\alog\*\0

你想列出哪些路径呢?
第7楼 lp1129 发表于 2007-09-20 13:51
初级用户 发帖 92 积分 186
这么说并不是不好操作了

如果有文件夹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楼 prcgolf 发表于 2007-09-20 13:52
新手上路 发帖 13 积分 19
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楼 lp1129 发表于 2007-09-20 14:04
初级用户 发帖 92 积分 186
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)
第10楼 prcgolf 发表于 2007-09-20 14:07
新手上路 发帖 13 积分 19
首先谢谢lp1129
能讲解一下吗?我对批处理真的不懂,多谢
第11楼 lp1129 发表于 2007-09-20 14:50
初级用户 发帖 92 积分 186
你可以查看此贴

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

lxmxn版主对这样的情况讲的非常清楚
第12楼 prcgolf 发表于 2007-09-20 17:36
新手上路 发帖 13 积分 19
多谢两位大侠,现在还有两个问题没有解决。
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楼 lp1129 发表于 2007-09-20 21:58
初级用户 发帖 92 积分 186
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楼 prcgolf 发表于 2007-09-21 12:04
新手上路 发帖 13 积分 19
to:lp1129
多谢!!

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

谢了
第15楼 lp1129 发表于 2007-09-21 16:14
初级用户 发帖 92 积分 186
@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 ]
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023