标题: [其他] 【讨论】批处理中的 . *分别代表什么意思 [打印本页]
作者: Hello123World 时间: 2011-12-19 16:54 标题: 【讨论】批处理中的 . *分别代表什么意思
"*.*"大家都会用,也都知道什么意思,但是这两个符号如果拆开呢?
将当前所有的txt文件的扩展名删除。- C:\Users\helloworld\Desktop\520\12>ren *.txt *.
复制代码
正则表达式中“.”代表任意字符,“*”代表任意个数。
批处理中“.”就是普通字符“.”,“*”相当于正则表达式中的“.*”:任意个数的任意字符。
这个结论除了在时无法解释,其它都是没问题的。
作者: 920168 时间: 2011-12-19 17:06
路过!学习!
作者: CrLf 时间: 2011-12-19 18:08
本帖最后由 CrLf 于 2011-12-19 18:18 编辑
. 有多义性:- 在相对路径中单个 . 代表当前文件夹,而 .. 代表上一级目录
- 在文件名中,最后一个 . 代表后缀,其余点为普通字符
- 在正则中代表任意单字节
- 一般作为普通字符出现
复制代码
而 * 在通配时仅能匹配文件名及后缀:- 当未指定后缀名时,* 能匹配任意文件类型
- 当指定了后缀时(哪怕后缀为空),只匹配具有相应后缀的文件
复制代码
ren *.txt *. 写成 ren *.txt ??????????????????????????? 亦是同理
另外,ren 中的通配有些比较繁琐的规则,请参考此贴:
http://bbs.bathome.net/viewthread.php?tid=3344
ren 命令在使用通配符时需要注意的地方
ren 完整文件名 *指定完整文件名中任意字符或连续的字符串.扩展名 改文件名为:从原文件名开头通配至指定字符(串).扩展名
1、
ren 完整文件名 *指定完整文件名中任意字符或连续的字符串.扩展名
改文件名为:从原文件名开头通配至指定字符(串).扩展名
如:
ren 10.pdf *0.c 得 10.c
ren 10.pdf *p.c 得 10.p.c
ren 10.pdf *d.c 得 10.pd.c
2、
ren 完整文件名 *指定完整文件名非连续的字符串.扩展名
改文件名为:从原文件名开头通配至指定字符串首符+余下的字符串内容.扩展名
如:
ren 10.pdf *1p.c 得 1p.c
ren 10.pdf *0dp.c 得 10dp.c
3、
ren 完整文件名 *指定除完整文件名中任意字符(串).扩展名
改文件名为:通配完整文件名+指定字任符(串).扩展名
如
ren 10.pdf *mm.c 得 10.pdfmm.c
作者: yyykkkyyyy 时间: 2011-12-19 22:33
讨论嘛我帮不上忙来凑个热闹,我认为现在批处理中用的命令本来是在DOS命令基础上加以功能扩展而来的,想规则地去定义 . * 不容易,举两例“添乱的题外话”:
1 当初DOS文件名实行"8.3"制,*.*中两*代表字符的数目也服从这规则,但是有人取名时超过了这个数呢,它也“好心兼容”,但是识别时超过部分忽略不计,至今仍可见这种踪影,比如
DIR *.htm 按说仅主名有通配符,并不是DIR *.htm*
但是 *.html 等只要后缀名(DOS中是称扩展名)中前3字符对上了的文件照样会列出来——延用了“8.3”时期规矩,要是表达后缀名只列两个字符之后不带* 却是规则地只匹配符合这两个字符的后缀,可能你会说这与 .或* 的定义无关?
2 早期的DOS较低版本中,点.除作为主名和扩展名的分隔符外,还定义表示当前目录(而连续两点..表上一级目录,且在DIR命令中可见到它们),此外好象没别的定义,而表达所有文件是需要用 *.* 的。
我的印象大约是DOS6.2 (这个版本号记不准确) 某些命令中可以用 . 表示 *.* 的意思了,新增个deltree外部命令时还强调说明,这个命令由于破坏性大,出于慎重现在才推出......也难怪,之前磁盘容量太小,3.5软盘都还是后来才有的
我的意思是,把DOS命令的功能逐步改造与现在系统兼容或说现在的命令仿原来的命令,且每次变更扩展都还或多或少考虑与前一次的兼容性,才形成了难以简捷定义如 . * 等符号的用法,更不要说还会用在不同场合有不同需求,当然肯定是可以准确地归纳列举式地定义它的用法。呵呵,就算有很全的答案凭我这笨脑子也记不住,硬是要用过几次看能否记得一点——主要是本人记性太差!
作者: weichenxiehou 时间: 2011-12-20 15:17
其实“正则表达式中.代表任意单个字符”的说法是不准确的,应该是“除换行符外的任意单个字符”。
作者: Hello123World 时间: 2011-12-20 16:16
回复 5# weichenxiehou
换行符不是两个字符吗?——\n,我也不是很懂,见笑了。
作者: weichenxiehou 时间: 2011-12-20 18:38
本帖最后由 weichenxiehou 于 2011-12-20 18:39 编辑
回复 6# Hello123World
可能是正则表达式起源于unix的缘故吧,在比较标准的介绍正则表达式的资料中,“.”都是解释为“匹配除换行符外的任意单个字符”。而你说的“\n”应该叫做“断行字符”(意即将两行内容分开)啦,而Windows系统和Unix系统(或Unix-like系统)的不同之处就是它们的断行符不同,Windows中是“版主”啦CRLF(^M$),是两个字符CR(回车符)和LF(换行符),而Unix系统(或Unix-like系统)中的断行符只有LF($)一个。应该是这样,若有误,请见谅。
作者: lllsoslll 时间: 2011-12-22 17:27
- :: 删除当前目录树下所有文件,包括隐藏和系统属性的
- del/a/q/s .
- :: 枚举当前目录树下所有目录,包括隐藏和系统属性的
- for /r %a in (.)do @echo %a
- :: 枚举当前目录树下所有目录的父目录,包括隐藏和系统属性的
- for /r %a in (..\)do @echo %a
- :: 枚举当前目录树下所有文件,包括系统和隐藏的
- for /r %a in (*)do @echo %a
- :: 枚举当前目录树下所有目录(不含路径),不含隐藏属性的
- for /d %a in (*)do @echo %a
- :: 枚举当前目录树下所有目录(含路径),含隐藏的和系统属性的
- for /d /r %a in (*)do @echo %a
- :: 测试下。。。。
- for /r %a in (..\*)do @echo %a
复制代码
作者: powerbat 时间: 2011-12-22 17:44
注意世界上应该是先有一般通配符,后来才发展出了正则表达式(不知道将来又会怎么发展)。
具体代表什么意思,主要看一般性用法和程序员爱好。
比如我偏要将*解释为“C:\”,你又怎的?
myexe.c- int main(int argc, char *argv[])
- {
- char *pdir;
- if (argv[1][0]=='*') pdir="C:\";
- }
复制代码
作者: Hello123World 时间: 2011-12-22 18:02
回复 8# lllsoslll
你一条条的列,但却不能保证每条都描述正确:
:: 枚举当前目录树下所有文件,包括系统和隐藏的(正确说法:去掉隐藏)
for /r %a in (*)do @echo %a
证明:
C:\Users\helloworld\Desktop\520\12>for /r %a in (*)do @echo %a
C:\Users\helloworld\Desktop\520\12\1.txt
C:\Users\helloworld\Desktop\520\12\a.txt
C:\Users\helloworld\Desktop\520\12\hello_ world.txt
C:\Users\helloworld\Desktop\520\12>attrib +s +h 1.txt
C:\Users\helloworld\Desktop\520\12>for /r %a in (*)do @echo %a
C:\Users\helloworld\Desktop\520\12\a.txt
C:\Users\helloworld\Desktop\520\12\hello_ world.txt
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |