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

[其他] 【讨论】批处理中的分隔符

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,

md命令中有4个分隔符,分别是:“,;=空格”

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

rd命令跟md命令相同。

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
  1. 小明
  2. 小红
  3. 小强
复制代码
code1
  1. @echo off
  2. For /f "tokens=1-2 delims=:" %%i in ('Findstr /n ".*" "1.txt"') do echo %%i=%%j
  3. pause
复制代码
code2
  1. @echo off
  2. For /f "tokens=1-2;delims=:" %%i in ('Findstr /n ".*" "1.txt"') do echo %%i=%%j
  3. pause
复制代码
code2,提示出错“此时不应有 ;delims=:"”
换成=号,“此时不应有 =delims=:"”
换成,号,“此时不应有 delims=:"”

假设不成立。

set 命令可能就是个反例...
个人看法:
cmd 中执行的外部命令使用同样的默认分隔符(其实传递给外部命令前已经被格式化为空格了)
内部命令使用不同的分隔符,甚至不需分隔符

TOP

楼主的反证有个疏漏
你的假设提到与命令语法不冲突的前提
但你的反证并没有证明for的options与分隔符没有语法冲突
而实际上for的options因为使用双引号
所以cmd的起始处理逻辑并不会对其进行切分
切分是交给for内部的逻辑来完成的
与你所说的“系统级”不是一回事

因为在这里讨论的分隔符适用范围没有太明确的定义
所以很难解释或说明一些命令特征和现象

对于命令行的处理
cmd与command的相同之处大致分为两部分
首先将输入的整行命令转存的内存中的缓冲区
然后在运行内部命令时对缓冲区的字符串进行循环检测
其中主要是对空格,逗号,分号以及换行符0x0a的检测
某些时候还有对等号的检测
主要以此来作为切分命令行的依据
所谓的切分就是在内存中更新几个指针
分别指向缓冲区中这些分隔的命令行参数的地址
然后就交由命令自己的处理逻辑
由它们自行决定是否使用这些地址指针
大部分命令会使用这些指针
也有些命令会不使用这些指针比如cd
还有些命令会按照自己的逻辑重新切分比如echo

cmd当然还有一些与command的不同之处
包括对Unicode字符分隔符的处理(比如全角的空格)
2

评分人数

天的白色影子

TOP

没有从那个时代走过,对COMMAND不了解,关于指针方面我还要努力啊
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

返回列表