Board logo

标题: [文件操作] [已解决]批处理如何从文本中读取不想删的文件名并不删它们? [打印本页]

作者: SkyPE    时间: 2010-5-31 15:55     标题: [已解决]批处理如何从文本中读取不想删的文件名并不删它们?

想法
“del *.txz”命令会删除所有的 txz 文件,但有一两个 txz 是不想删的,于是乎把它们的名字存入“1.txt”,在“del *.txz”命令执行时读取“1.txt”,从而不删除这些想保留的文件。如何实现上述想法?
举例
手机内存卡根目录中有“EBOOK”这个文件夹,里面存放着文本文件 txt 和书签文件 txz。我做了个批处理,存放在内存卡根目录中,命令只有一句“del EBOOK\*.txz”,但我的《三国演义》和《基督山伯爵》的书签文件不想删掉,那么按照上面的想法,把“三国演义.txz”、“基督山伯爵.txz”这两个文件名写进“1.txt”中(一行一个),那么如何让批处理读取“1.txt”从而不删除这两个书签并删除其他的所有书签?

^ ^ 这样以后有什么没看完的书、不想把它的书签删除的话,只需要更改一下“1.txt”就行了~
这对高手们应该是小菜一碟了,盼望着您的吹灰之力解我燃眉之需!~

[ 本帖最后由 SkyPE 于 2010-5-31 16:26 编辑 ]
作者: hanyeguxing    时间: 2010-5-31 16:04

批处理在“EBOOK”这个文件夹,排除列表直接写在批处理里
  1. @echo off
  2. set "三国演义.txz=="
  3. set "基督山伯爵.txz=="
  4. for %%a in (*.txz) do if not defined %%a del "%%a"
复制代码
或:
  1. @echo off
  2. for /f "delims=" %%a in ('more +4^<"%~fs0"') do set "%%a=="
  3. for %%a in (*.txz) do if not defined %%a del "%%a"
  4. exit
  5. 三国演义.txz
  6. 基督山伯爵.txz
复制代码
如果读取1.txt,则:
  1. @echo off
  2. for /f "delims=" %%a in (1.txt) do set "%%a=="
  3. for %%a in (*.txz) do if not defined %%a del "%%a"
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-31 16:19 编辑 ]
作者: hanyeguxing    时间: 2010-5-31 21:02

原帖由 SkyPE 于 2010-5-31 20:53 发表
@echo off
for /f "delims=" %%a in (1.txt) do set "%%a=="
for %%a in (*.txz) do if not defined %%a del "%%a"
pause
上面的第二、三两行您能用普通的语言解释下是什么意思吗?谢谢!

1,有问题请发论坛
2,for /f "delims=" %%a in (1.txt) do set "%%a=="解析文本1.txt的内容,不以任何字符分隔文本,并将每行内容都定义为变量。
for %%a in (*.txz) do if not defined %%a del "%%a"在当前目录下查询所有扩展名为.txz的文件,如果该文件名没有被定义,则执行del命令,也就是如果该文件名被定义为变量,则不执行del。定义的过程由上一个for完成
作者: SkyPE    时间: 2010-5-31 21:09

明白了很多,再次谢谢!
我是菜鸟,正在学坛子里德“FOR由入门到精通”,正好能帮助理解,
第三句的“if not defined %%a”,到这儿还能明白,但后面的“del %%a”就不太懂,那样不就把前面定义的给删了吗?

[ 本帖最后由 SkyPE 于 2010-5-31 21:18 编辑 ]
作者: Batcher    时间: 2010-5-31 22:43     标题: 回复 4楼 的帖子

del删掉是存放在硬盘上的文件。
前面定义的变量是放在内存里面的,不会被del删掉。
作者: SkyPE    时间: 2010-6-5 15:19     标题: 回复 5楼 的帖子

“for /f "delims=" %%a in (1.txt) do set "%%a=="”把1.txt中每行的内容都定义了(且都定义成了“=”),但“for %%a in (*.txz) do……”又把相同的变量a重新定义成了“以txz为扩展名的所有文件名”,这样这两次定义不矛盾吗?(很明显不矛盾,要不这程序就没法用了!呵呵,可是我不懂为何不矛盾)而且其后又紧接有“if not defined %%a del "%%a"”,这句话我也感觉匪夷所思,假如上步中未被定义的,这步也已经得到了定义啊!(均被定义成了“以txz为扩展名的所有文件名”),那么“del”动作又怎么正确地完成了删除动作呢?
我脑子有点死,实在搞不懂这两句了……
>.<


如果一个批处理很长,前面曾定义过一个变量x,但后来的时候忘了,又把x定义了一遍,并且定义成了别的值,那么再往后的命令调用x的时候,是调用的它先前的量、还是后来的量呢?

[ 本帖最后由 SkyPE 于 2010-6-5 15:37 编辑 ]
作者: Batcher    时间: 2010-6-5 17:18     标题: 回复 6楼 的帖子

后面定义的变量会覆盖前面定义的同名变量。

给自定义变量一个有意义的名字是很重要的,不要用什么a、b、c、x、y、z之类的。过一段时间连自己都不知道它是啥意思了。
作者: hanyeguxing    时间: 2010-6-5 19:27

1,楼主混淆了%a%和%%a。
2,定义变量是由set完成的,即当%%a为“三国演义.txz”时,定义了一个变量,名是“三国演义.txz”,值是“=”,和a没有关系。
3,%%a只在扩展此参数的for的内部使用。
4,当楼主有一天真的已经开始常写很长的批处理时,设置变量已经就不在是问题。有的人喜欢按字母顺序去设置变量名,有的人喜欢分组设置变量名,有的人喜欢使用英文单词,也有的人会喜欢用拼音。当自己的规律形成时,就不会有问题了。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2