![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-03 19:23 |
共 48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [请教]怎么获取各个文件夹下都有的最新的同名文件? |
| 可打印版本 1,441 / 8 |
| 第1楼 Billunique | 发表于 2007-03-22 05:57 |
| 中级用户 发帖 112 积分 259 | |
|
[请教]怎么获取各个文件夹下都有的最新的同名文件? 现在有个这样的问题向各位求教,恳请帮忙。
在一个网络目录下,假设为\\server\ourmyfile\ 它下面有很多的子文件夹,这些子文件夹视不同的情况有很多层。 但许多子文件夹下都有一个我需要的文件,比如goal.htm,它们名称相同,但最后的修改日期都是不同的。另外每个文件夹的日期对应goal.htm的日期(即文件夹新,它里层的goal.htm就新)。 我现在想把它们中最新的goal.htm(只包含其路径信息)搜出来,即让全部的goal.htm按日期由新到旧排列,该怎么操作呢? 本人小菜一个,我自己想到的方法仅是: set path1=\\server\ourmyfile dir /s /b /o-d %path1%\goal.htm >>a.txt 但是/o-d只在每个文件夹内部有效,而提取出的goal.htm还是会按照dir出来的每个goal.htm的根文件夹的顺序来排序,这样的话关键就在于文件夹的排列顺序了。 然而我发现dir网络路径时,其排序方式似乎和在本机的不太一样,比较乱,我很不清楚它的排列规则。要是能让dir先把文件夹按从新到旧先排列好,然而再递进其内部,这样就能把最新的goal.htm列在最前头了。 怎么实现呢?先行谢过啊! [ Last edited by Billunique on 2007-9-22 at 04:07 PM ] |
|
| 第2楼 Billunique | 发表于 2007-03-22 06:01 |
| 中级用户 发帖 112 积分 259 | |
|
补充:
其实可以不用管我说的 文件夹与所需文件goal.htm的对应关系。 只要能把这些文件夹中最新的goal.htm找出来就行,目的只是这个。 向你请教,谢谢! |
|
| 第3楼 Billunique | 发表于 2007-03-22 10:49 |
| 中级用户 发帖 112 积分 259 | |
|
咋没人理会啊,伤心:(~
求助啊,版主们!老大们!namejm、willsort、无奈何、如是大师……! |
|
| 第4楼 lxmxn | 发表于 2007-03-22 12:37 |
| 版主 发帖 4,938 积分 11,386 | |
|
命令行执行下面的:
|
|
| 第5楼 Billunique | 发表于 2007-03-23 00:19 |
| 中级用户 发帖 112 积分 259 | |
|
多谢lxmxn大侠的热心相助!你已经帮我解决了我的问题。但在下还有一些疑惑,想再向你请教一下。
1 在此例中,因我只搜文件,加了 /a-d 是不是比不加速度要快? 2 echo / 与 直接 echo的作用有何区别呢? 3 我查了下,%~a是删除前后引号,%~a比直接%a有什么好处呢,你是出于什么考虑的? 4 其实我想要的只是最新文件的全路径,以为下一步拷贝它作准备。 因为记录在a.txt里的格式是2007-03-05 14:39 \\server\ourfile\…… 我在你的基础上 for /f "tokens=3 delims= " %%b in (a.txt) do (copy %%b && goto endfor) :endfor (无内容) 实现了把第一个文件拷贝出来。 请问能否让它在a.txt里的时候就只显示路径,却按日期从新到旧排列呢? 多谢大侠!^_^ |
|
| 第6楼 lxmxn | 发表于 2007-03-23 01:46 |
| 版主 发帖 4,938 积分 11,386 | |
|
Re Billunique: 1、加了/a-d 参数可以筛选文件,忽略文件夹,可以提高速度; 2、echo/和echo 的作用差不多;有细微的区别,echo/在命令执行可以输出一空行,而单独的echo 就会显示当前命令提示符的echo 设置状态,是打开还是关闭了; 3、%~a 是个人使用习惯,在这里没有什么作用; 4、在命令行执行: |
|
| 第7楼 Billunique | 发表于 2007-03-23 07:02 |
| 中级用户 发帖 112 积分 259 | |
|
哈真好!真是厉害。不过还要请教啊:)
1 我把tokens=1-3*改成tokens=1,2*试了试,发现结果虽然一样,但后者(b.txt)生成的列表文件却比前者(a.txt)要大一些。我看了下,生成文件有30行,而b.txt正好比a.txt大了30个字节。 我想了想,应该跟"1,2*"比"1-3*"多取一个空格有关(第2个和第3个token间有一个空格)但a.txt与b.txt在每行的前头都是一样的,唯一区别就是b.txt比a.txt在文本结束的地方多了一个空格。 为什么这样呢,为什么这个空格自动被转到了文本后头呢? 另外如果那个路径下有的文件夹名字中包含空格,用"1-3*"就取不全了,呵呵是吗? 2 为什么你要用前导符呢?我试了一下,去掉它们是不行的,它们在这起什么作用? 3 for是否有嵌套的限制?我学你的样子,呵就不行了,问题在哪呢? for /f %%i in ('for /f "tokens=1,2*" %%x in ^('^(for /f "delims=" %%a in ^('dir /s/b/a-d %path1%\%1.htm'^) do @echo/%%~ta %%~a^)^|sort /r'^) do @echo %%z') do (@copy %%i && goto endf) :endf 希望你不会不胜我烦啊:) |
|
| 第8楼 lxmxn | 发表于 2007-03-23 09:36 |
| 版主 发帖 4,938 积分 11,386 | |
|
Re Billunique: 1、兄的理解是正确的,如果有空格,就可能取不到完整的路径了;至于为什么后面会多出一个空格出来,想了半天还是没有想出来,兄可以自己研究一下,特别是tokens里面有*的时候,注意区别; 2、加了前导符是为了转义和与外置的for相区别开; 3、对于多个for的嵌套还没有试过,试了变天也没有成功,不知道是for的原因还是我们的命令格式有误;兄可以考虑转义和扩展,看问题能解决么。 |
|
| 第9楼 Billunique | 发表于 2007-03-23 11:33 |
| 中级用户 发帖 112 积分 259 | |
|
再傻问一句:
为什么要转义和同外置的for相区分呢?不加上的话命令会失效,那失效的原因又是什么呢? ![]() [ Last edited by Billunique on 2007-3-23 at 11:37 AM ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |