[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 【讨论】批处理中的 . *分别代表什么意思

"*.*"大家都会用,也都知道什么意思,但是这两个符号如果拆开呢?

将当前所有的txt文件的扩展名删除。
  1. C:\Users\helloworld\Desktop\520\12>ren *.txt *.
复制代码
正则表达式中“.”代表任意字符,“*”代表任意个数。

批处理中“.”就是普通字符“.”,“*”相当于正则表达式中的“.*”:任意个数的任意字符。

这个结论除了在
dir /s /b .
时无法解释,其它都是没问题的。

路过!学习!
http://www.diecasting86.com

TOP

本帖最后由 CrLf 于 2011-12-19 18:18 编辑

. 有多义性:
  1. 在相对路径中单个 . 代表当前文件夹,而 .. 代表上一级目录
  2. 在文件名中,最后一个 . 代表后缀,其余点为普通字符
  3. 在正则中代表任意单字节
  4. 一般作为普通字符出现
复制代码
而 * 在通配时仅能匹配文件名及后缀:
  1. 当未指定后缀名时,* 能匹配任意文件类型
  2. 当指定了后缀时(哪怕后缀为空),只匹配具有相应后缀的文件
复制代码
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

TOP

讨论嘛我帮不上忙来凑个热闹,我认为现在批处理中用的命令本来是在DOS命令基础上加以功能扩展而来的,想规则地去定义 . * 不容易,举两例“添乱的题外话”:
1 当初DOS文件名实行"8.3"制,*.*中两*代表字符的数目也服从这规则,但是有人取名时超过了这个数呢,它也“好心兼容”,但是识别时超过部分忽略不计,至今仍可见这种踪影,比如
DIR *.htm   按说仅主名有通配符,并不是DIR *.htm*
但是 *.html 等只要后缀名(DOS中是称扩展名)中前3字符对上了的文件照样会列出来——延用了“8.3”时期规矩,要是表达后缀名只列两个字符之后不带* 却是规则地只匹配符合这两个字符的后缀,可能你会说这与 .或* 的定义无关?
2 早期的DOS较低版本中,点.除作为主名和扩展名的分隔符外,还定义表示当前目录(而连续两点..表上一级目录,且在DIR命令中可见到它们),此外好象没别的定义,而表达所有文件是需要用 *.* 的。
我的印象大约是DOS6.2 (这个版本号记不准确) 某些命令中可以用 . 表示 *.* 的意思了,新增个deltree外部命令时还强调说明,这个命令由于破坏性大,出于慎重现在才推出......也难怪,之前磁盘容量太小,3.5软盘都还是后来才有的
我的意思是,把DOS命令的功能逐步改造与现在系统兼容或说现在的命令仿原来的命令,且每次变更扩展都还或多或少考虑与前一次的兼容性,才形成了难以简捷定义如 . * 等符号的用法,更不要说还会用在不同场合有不同需求,当然肯定是可以准确地归纳列举式地定义它的用法。呵呵,就算有很全的答案凭我这笨脑子也记不住,硬是要用过几次看能否记得一点——主要是本人记性太差!

TOP

其实“正则表达式中.代表任意单个字符”的说法是不准确的,应该是“除换行符外的任意单个字符”。
1

评分人数

    • CrLf: 感谢指正!PB + 5
看得多说得多,远比不上写得多。

TOP

回复 5# weichenxiehou


    换行符不是两个字符吗?——\n,我也不是很懂,见笑了。

TOP

本帖最后由 weichenxiehou 于 2011-12-20 18:39 编辑

回复 6# Hello123World
可能是正则表达式起源于unix的缘故吧,在比较标准的介绍正则表达式的资料中,“.”都是解释为“匹配除换行符外的任意单个字符”。而你说的“\n”应该叫做“断行字符”(意即将两行内容分开)啦,而Windows系统和Unix系统(或Unix-like系统)的不同之处就是它们的断行符不同,Windows中是“版主”啦CRLF(^M$),是两个字符CR(回车符)和LF(换行符),而Unix系统(或Unix-like系统)中的断行符只有LF($)一个。应该是这样,若有误,请见谅。
1

评分人数

看得多说得多,远比不上写得多。

TOP

  1. :: 删除当前目录树下所有文件,包括隐藏和系统属性的
  2. del/a/q/s .
  3. :: 枚举当前目录树下所有目录,包括隐藏和系统属性的
  4. for /r %a in (.)do @echo %a
  5. :: 枚举当前目录树下所有目录的父目录,包括隐藏和系统属性的
  6. for /r %a in (..\)do @echo %a
  7. :: 枚举当前目录树下所有文件,包括系统和隐藏的
  8. for /r %a in (*)do @echo %a
  9. :: 枚举当前目录树下所有目录(不含路径),不含隐藏属性的
  10. for /d %a in (*)do @echo %a
  11. :: 枚举当前目录树下所有目录(含路径),含隐藏的和系统属性的
  12. for /d /r %a in (*)do @echo %a
  13. :: 测试下。。。。
  14. for /r %a in (..\*)do @echo %a
复制代码
SOS --- >> lllsoslll@163.com

TOP

注意世界上应该是先有一般通配符,后来才发展出了正则表达式(不知道将来又会怎么发展)。

具体代表什么意思,主要看一般性用法和程序员爱好。
比如我偏要将*解释为“C:\”,你又怎的?
myexe.c
  1. int main(int argc, char *argv[])
  2. {
  3.     char *pdir;
  4.     if (argv[1][0]=='*') pdir="C:\";
  5. }
复制代码

TOP

回复 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

TOP

返回列表