标题: [其他] 【讨论】批处理中的分隔符 [打印本页]
作者: Hello123World 时间: 2011-10-1 14:40 标题: 【讨论】批处理中的分隔符
echo命令中有6个分隔符,分别是:“./\=;,”
C:\Users\helloworld\Desktop>echo.
C:\Users\helloworld\Desktop>echo\
C:\Users\helloworld\Desktop>echo/
C:\Users\helloworld\Desktop>echo=
C:\Users\helloworld\Desktop>echo;
C:\Users\helloworld\Desktop>echo,
C:\Users\helloworld\Desktop>md 1,2
C:\Users\helloworld\Desktop>md 3=4
C:\Users\helloworld\Desktop>md 5;6
C:\Users\helloworld\Desktop>md 7 8
C:\Users\helloworld\Desktop>rd 1,2
C:\Users\helloworld\Desktop>rd 3=4
C:\Users\helloworld\Desktop>rd 5;6
C:\Users\helloworld\Desktop>rd 7 8
再检测del命令的分隔符:
1.创建文本,供del删除;
C:\Users\helloworld\Desktop>for /l %i in (12;1;21) do @echo\ >%i.txt
2.检测del的分隔符;
C:\Users\helloworld\Desktop>del 12.txt=13.txt
C:\Users\helloworld\Desktop>del 14.txt;15.txt
C:\Users\helloworld\Desktop>del 16.txt,17.txt
C:\Users\helloworld\Desktop>del 18.txt/19.txt
无效开关 - "19.txt"。
C:\Users\helloworld\Desktop>del 18.txt\19.txt
目录名称无效。
C:\Users\helloworld\Desktop>del 18.txt.19.txt
找不到 C:\Users\helloworld\Desktop\18.txt.19.txt
C:\Users\helloworld\Desktop>del 18.txt 19.txt
3.检测结果
不难看出,del的分割符也是4个,分别是:“,;=空格”
这里大胆的提出一个假设,“,;=空格”4个分隔符是系统级的,在与命令语法不冲突的前提下(例:echo与空格),可以在任意命令中作为分隔符使用。
用for反证一下:
1.txt复制代码
code1- @echo off
- For /f "tokens=1-2 delims=:" %%i in ('Findstr /n ".*" "1.txt"') do echo %%i=%%j
- pause
复制代码
code2- @echo off
- For /f "tokens=1-2;delims=:" %%i in ('Findstr /n ".*" "1.txt"') do echo %%i=%%j
- pause
复制代码
code2,提示出错“此时不应有 ;delims=:"”
换成=号,“此时不应有 =delims=:"”
换成,号,“此时不应有 delims=:"”
作者: CrLf 时间: 2011-10-1 16:33
set 命令可能就是个反例...
个人看法:
cmd 中执行的外部命令使用同样的默认分隔符(其实传递给外部命令前已经被格式化为空格了)
内部命令使用不同的分隔符,甚至不需分隔符
作者: qzwqzw 时间: 2011-10-2 09:52
楼主的反证有个疏漏
你的假设提到与命令语法不冲突的前提
但你的反证并没有证明for的options与分隔符没有语法冲突
而实际上for的options因为使用双引号
所以cmd的起始处理逻辑并不会对其进行切分
切分是交给for内部的逻辑来完成的
与你所说的“系统级”不是一回事
因为在这里讨论的分隔符适用范围没有太明确的定义
所以很难解释或说明一些命令特征和现象
对于命令行的处理
cmd与command的相同之处大致分为两部分
首先将输入的整行命令转存的内存中的缓冲区
然后在运行内部命令时对缓冲区的字符串进行循环检测
其中主要是对空格,逗号,分号以及换行符0x0a的检测
某些时候还有对等号的检测
主要以此来作为切分命令行的依据
所谓的切分就是在内存中更新几个指针
分别指向缓冲区中这些分隔的命令行参数的地址
然后就交由命令自己的处理逻辑
由它们自行决定是否使用这些地址指针
大部分命令会使用这些指针
也有些命令会不使用这些指针比如cd
还有些命令会按照自己的逻辑重新切分比如echo
cmd当然还有一些与command的不同之处
包括对Unicode字符分隔符的处理(比如全角的空格)
作者: wc726842270 时间: 2011-10-2 11:53
没有从那个时代走过,对COMMAND不了解,关于指针方面我还要努力啊
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |