![]() |
中国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: 你想列出哪些路径呢? |
|
| 第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 | |
| 第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 |