找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 34753|回复: 9

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

[复制链接]
发表于 2011-12-19 16:54:18 | 显示全部楼层 |阅读模式
"*.*"大家都会用,也都知道什么意思,但是这两个符号如果拆开呢?

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

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

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

评分

参与人数 1PB +5 收起 理由
CrLf + 5 感谢指正!

查看全部评分

 楼主| 发表于 2011-12-20 16:16:54 | 显示全部楼层
回复 5# weichenxiehou


    换行符不是两个字符吗?——\n,我也不是很懂,见笑了。
发表于 2011-12-20 18:38:29 | 显示全部楼层
本帖最后由 weichenxiehou 于 2011-12-20 18:39 编辑

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

评分

参与人数 1PB +2 技术 +1 收起 理由
Hello123World + 2 + 1 原来如此,多谢指点。

查看全部评分

发表于 2011-12-22 17:27:52 | 显示全部楼层

  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
复制代码
发表于 2011-12-22 17:44:07 | 显示全部楼层
注意世界上应该是先有一般通配符,后来才发展出了正则表达式(不知道将来又会怎么发展)。

具体代表什么意思,主要看一般性用法和程序员爱好。
比如我偏要将*解释为“C:\”,你又怎的?
myexe.c

  1. int main(int argc, char *argv[])
  2. {
  3.     char *pdir;
  4.     if (argv[1][0]=='*') pdir="C:";
  5. }
复制代码
 楼主| 发表于 2011-12-22 18:02:32 | 显示全部楼层
回复 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 11:31 , Processed in 0.021298 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表