|
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
状态 离线
|
|
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 |
|