Board logo

标题: 问个删除文件的批处理 [打印本页]

作者: onlykier     时间: 2006-11-5 15:10    标题: 问个删除文件的批处理

假设目录如下
d:\a\b
d:\a\c\a1
d:\a\c\a2
而且3个目录下都有若干文件,现在想删除每个目录下产生时间最早的所有文件,请问如何写命令?
谢谢各位
作者: lxmxn     时间: 2006-11-5 18:41

  楼主所说的"较早的文件"是指什么时候的文件呢?还是想删除创建时间较早的前几个文件呢?如果要删除创建时间较早的前几个可以用以下的代码:
@echo off
setlocal enabledelayedexpansion
set /p num=要删除创建较早的前几个文件?
for /f "tokens=1,* delims=:" %%i in ('dir /a-d/tc/b ^| findstr/n . ') do (
        set /a a=%%i
        if !a! LEQ %num% del %%j
)
endlocal

作者: onlykier     时间: 2006-11-5 20:09
2f的兄弟,我是想删除创建时间最早的那一天的所有文件,但是却不知道具体的数目,请问该怎么做?
假设目录下有60个文件,每天有4个文件产生,也就是说存有15天的文件,我现在想删掉最早那天的4个文件,请问该如何做?

如果目录下文件数数目不清,每天产生的数目不清楚而且不固定,我现在想删掉最早那天的所有文件,请问该如何做?
上面全是以文件创建时间为依据

[ Last edited by onlykier on 2006-11-5 at 07:35 AM ]
作者: onlykier     时间: 2006-11-5 21:13
回去睡了,晚上等兄弟们的好消息..
作者: onlykier     时间: 2006-11-5 21:24
有个思路,放这标下,晚上在来搞
用dir /a-d/tc >>1.txt
用个循环将1.txt的每行的第一个数即时间保存,在循环里设置一个变量,因为第一个文件肯定是要删除的 ,当循环进行到第二次时,用时间与第一个文件的时间比较,相同则继续循环并作删除,不相同则跳出循环。
作者: vkill     时间: 2006-11-6 07:15
http://www.cn-dos.net/forum/view ... ge=1&highlight=
作者: onlykier     时间: 2006-11-6 21:55
楼上的兄弟,你的链接里的例子都要有参数,我问的问题不是那样的。。。
作者: onlykier     时间: 2006-11-6 22:47
请各位看看下面的代码为什么会出错
@echo off
dir /s /a-d /tc|sort|find "-"|find /v "序列"
set c=0
for /f "tokens=1,4 delims= " %%i in ('dir /s /a-d /tc|sort|find "-"|find /v "序列"') do (
if c equ 0 (set a=%%i
                echo %%j
)else
(
set b=%%i
if "b"=="a" (echo %%j
                set a=b)
set /a c+=1))

命令语法不正确。

[ Last edited by onlykier on 2006-11-6 at 10:24 AM ]
作者: onlykier     时间: 2006-11-6 23:35
有人在吗?在线等
作者: redtek     时间: 2006-11-7 01:35
如果运行出错了,就把 @echo off 这个去掉再调试,就会看到系统提示在哪一个命令上出错的信息:)

这句里 dir /s /a-d /tc|sort|find "-"|find /v "序列 里面是不是有特殊符号?
想想看哪一个符号是需要脱逸符(脱字符)(^)来转义的?
(如果 @echo off 状态下,将看不到更详细的错误信息)

请再看一下 IF /? 的帮助,再看一下你的这个IF的用法:)
“ELSE 子句必须在 IF 之后出现在同一行上……”,你看一下你的IF的用法是不是不太符合要求?

……
另:
  for ……
      if ....) else (....  if ...() )....
在你这么多语句当中,有很多的括号,尤其是最后这两个“ )) ”括号,
当代码量非常多的情况下,如果书写代码不规范,无论是自己还是别人找起错误来简直是不能忍受的事情,
而且更不利于清晰易懂和除错……

另:
你前面都赋值了:  set c=0
那么后面的……
if c equ 0  (如果 c 等于0,则……) 这个 c 变量 if 会“认识”吗?

if %c% equ 0 和  if c equ 0 你认为有区别吗?

[ Last edited by redtek on 2006-11-7 at 01:38 AM ]
作者: onlykier     时间: 2006-11-7 02:47
dir /s /a-d /tc|sort|find "-"|find /v "序列"
这句话的意思是
/s 显示当前目录及子目录的文件
/a-d 结果中去除文件夹的信息
/tc 按创建时间显示
|sort 是对dir /s/a-d/tc 的结果进行排序,按创建时间从早到晚排序
|find "-" 对dir /s /a-d /tc|sort 的结果进行筛选,只显示带有"-"的行
|find /v "序列" 的作用是,由于dir /s /a-d /tc|sort|find "-"显示的结果中有一行结果是不相要的,所以对dir /s /a-d /tc|sort|find 的结果中去除带有"序列"的那行
dir /s /a-d /tc|sort|find "-"|find /v "序列" 结果类此如下
2006-10-01  19:49              123,392 asdfasdfasd060921-060927.xls
2006-10-01  19:49              123,904 asdfasdfasd060914-060920.xls
2006-10-01  19:49              161,280 asdfasdfasd060831-060906.xls
2006-10-01  19:49              167,936 asdfasdfasd060907-060913.xls
2006-10-07  19:08              160,768 asdfasdfasd060824-060830.xls
2006-10-07  19:13              124,928 asdfasdfasd060928-061004.xls
2006-10-12  00:17              124,416 asdfasdfasd061005-061011.xls
2006-10-19  08:18              124,928 asdfasdfasd061012-061018.xls
2006-10-26  12:22              124,928 asdfasdfasd061019-061025.xls

其中上面的文件是在不同目录中的

关键是for /f "tokens=1,4 delims= " %%i in ('dir /s /a-d /tc|sort|find "-"|find /v "序列"')  这句
我想只取上面的结果中的第一列和第四列,即时间和文件名
但是这个for 却显示错误 此时不应有 |。
大家可以试验下面的句子就可以了
for /f "tokens=1,4 delims= " %%i in ('dir /s /a-d /tc|sort|find "-"|find /v "序列"')  do echo %%i

至于for中的循环体,可能是我表达不好,大家可以运行下面的代码
set b=0
for /l %%i in (1,1,4) do (
echo %b%
set /a b+=1)
我想显示
0
1
2
3
4
但是却显示成
0
0
0
0
0
请问大虾 该如何做?

[ Last edited by onlykier on 2006-11-6 at 01:52 PM ]
作者: onlykier     时间: 2006-11-7 02:51
顺便问下 %%i %i% !i! %i 有什么区别?
作者: redtek     时间: 2006-11-7 03:07
%%i 出自于 for %%i in (...) do ... 双%号在批处理中运行使用,代表变量

%i% 出自于   Set  i=Redtek     这种形式在批处理或命令行都可以使用

%i  出自于直接在非批处理(在命令行中)直接键入的命令,
   如:  C:\> for %i in (...) do ....  它同样代表变量

%0   %1 .... 也代表变量(指参数),运行批处理时所带入的运行参数
   如:Dir /?  这个 /? 就代表参数
----------------------------------

onlykier开发速度太快,已经跳过了很多好玩的内容,
建议onlykier兄一定要去看下面这个贴子~:)
然后把下面贴子上的内容从头到尾做一遍,任何一行代码全都做一遍:)


[简单索引]关于SET变量、延时变量、各种符号的用法……
http://www.cn-dos.net/forum/viewthread.php?tid=24549&fpage=1


另:希望onlykier在上面贴子的链接中所指的内容,从头到尾全做一遍~:)
  当做论坛作业了啊,嘻嘻……

[ Last edited by redtek on 2006-11-7 at 03:11 AM ]
作者: onlykier     时间: 2006-11-7 03:18
楼上的兄弟 !i! 这个怎么用阿?
还有我想显示这个结果
0
1
2
3
4
该怎么做
作者: redtek     时间: 2006-11-7 03:28


  Quote:
Originally posted by onlykier at 2006-11-7 03:18:
楼上的兄弟 !i! 这个怎么用阿?
还有我想显示这个结果
0
1
2
3
4
该怎么做

第一种方法:
@echo %dbg% off

for /L %%i in (0,1,4) do (
        echo %%i
)

作者: redtek     时间: 2006-11-7 03:36
你要的延时变量所达到的效果:

第二种方法:
@echo %dbg% off
setlocal enabledelayedexpansion

set b=0
for /l %%i in (0,1,4) do (
        echo !b!
        call set /a b+=1
)
输出如下:
C:\TEMP\k>b.bat
0
1
2
3
4

作者: onlykier     时间: 2006-11-7 03:44
楼上的兄弟,你完全是在偷巧阿
这样,我要求
@echo %dbg% off

for /L %%i in (0,1,4) do (
        echo %%i
)
echo %%i 中不能用%%i来显示,要用另外一个变量显示,该变量和%%i一点关系都不能有
作者: redtek     时间: 2006-11-7 03:47
onlykier兄,看了你8楼的代码例子,并运行了很多次并调试……
不过,你上面要处理的问题并没有跟上你的思路:)

你想了如何去解决一个问题,可是偏偏出现错误的地方几乎全都是因为一些基础的知识点所影响着:)
而onlykier兄的学习速度太快了,但最后还要回到那些基础的变量赋值、SET、延时变量、For的结构、特殊符号的运行和转义……

所以,建议onlykier把下面链接中所提到的知识点重新、从头到尾的一行一行代码全都键入一遍~:)
然后回过头来再看,相信onlykier兄会超越现在……
而这一切过程很可能仅仅几天甚至一、两天就够了,
可是这一两天的从头到尾做一遍这些知识点,相信onlykier永远都不再会问题了,
而是开始走入了知道如何处理一些不知道的问题并可以极快的找到办法:)


[简单索引]关于SET变量、延时变量、各种符号的用法……
http://www.cn-dos.net/forum/viewthread.php?tid=24549&fpage=1

[ Last edited by redtek on 2006-11-7 at 03:57 AM ]
作者: onlykier     时间: 2006-11-7 04:02
楼上的兄弟,你杀了我吧
我再来个例子
我只想显示第一行,下面的代码确都显示,why?
@echo off
dir d: /b>>d:\1.txt
set c=0
echo 1,%c%
for /f %%i in (d:\1.txt) do (
if %c% equ 0 (set c=1
echo 2,%c%
echo %%i)
)

[ Last edited by onlykier on 2006-11-6 at 03:12 PM ]
作者: redtek     时间: 2006-11-7 04:10
楼上的兄弟,我不杀你,还是你让我自杀吧~:)

你的 for (你这里不加 /f 参数能读出文件内容来吗?) %%i in (d:\1.txt) do (
作者: onlykier     时间: 2006-11-7 04:12
我修改了,楼上的兄弟,你qq多少,我等答案等的的心痛啊
作者: onlykier     时间: 2006-11-7 04:14
set c=1
echo 2,%c%
为什么输出的 %c%还是0阿??
作者: onlykier     时间: 2006-11-7 04:28
论坛翻页,没看到redtek 的第二种方法 ^^!
set b=0
for /l %%i in (0,1,4) do (
        echo !b!
        call set /a b+=1
再请教下,这里问什么要有call呢?
作者: redtek     时间: 2006-11-7 04:30

@echo %dbg% off
::   延时变量
setlocal enabledelayedexpansion

dir d: /b>>d:\1.txt
set c=0
echo 1,%c%

::  /f 参数
::  "delims=" 可以读取含空格的字符串……
for /f "delims=" %%i in (d:\1.txt) do (

        if !c! equ 0 (
                set c=1
                echo 2,!c!
                echo %%i
        )
)

建议这样按缩进书写代码:)
[ Last edited by redtek on 2006-11-7 at 04:36 AM ]
作者: lxmxn     时间: 2006-11-7 04:30

@echo off
dir c:\ /b>>c:\1.txt
set /p s=<c:\1.txt
echo %s%
pause

作者: redtek     时间: 2006-11-7 04:31


  Quote:
Originally posted by onlykier at 2006-11-7 04:28:
论坛翻页,没看到redtek 的第二种方法 ^^!
set b=0
for /l %%i in (0,1,4) do (
        echo !b!
        call set /a b+=1
再请教下,这里问什么要有call呢?

那个 call 删了吧,那是做别的实验留下的COPY上来时忘了删了~:)
作者: redtek     时间: 2006-11-7 04:32
lxmxn兄代码非常简捷,欣赏~:)
作者: onlykier     时间: 2006-11-7 04:48
@echo off
dir c:\ /b>>c:\1.txt
set /p s=<c:\1.txt
echo %s%
pause
这段代码为什么只显示第一行?
我觉的应该显示好多阿,因为c:\1.txt内容给了s了阿