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

[其他] [已解决]批处理命令FOR空格和跳格做分隔符的区别及delims位置选择

FOR命令空格符和跳格符做分隔符的区别以及delims的位置选择
在本人机器上运行net user结果如下:

[url=file://\\LUMIERE_DENG]\\LUMIERE_DENG[/url] 的用户帐户
-------------------------------------------------------------------------------
Administrator            Guest                    HelpAssistant            
lh                       SUPPORT_388945a0         
命令成功完成。

后本人想将里面的账户名一个个显示出来,经过请教论坛达人,后来自己在学习过程中发现FOR /F命令对于分隔符指定还有delims和tokens谁在前谁在后这些问题的处理上有些很有趣的地方,觉得值得大家注意一下,所以冒昧贴出来,希望达人不要见笑。

言归正传,一下是三段代码都是本人编写的,后面附有相应的解释,大家可以复制成bat文本试一下,很有趣,希望这个帖子可以解决所有新手在FOR /F命令上遇到的关于分隔符指定还有delims和tokens谁在前谁在后的问题,无量公德,呵呵。

::代码1:
@echo off
for /f "skip=4 delims=  tokens=1" %%a in ('net user') do echo %%a
pause
::上面代码delims=后面是跳格键,结果不能把所有用户名以其原有格式显示出来。

::代码2:
@echo off
for /f "skip=4 delims=  tokens=1" %%a in ('net user') do echo %%a
pause
::上面代码delims=后面是两个空格键,结果能将所有用户显示出来,不会出现错误。

::代码3:
@echo off
for /f "skip=4 delims= TOKENS=1" %%a in ('net user') do echo %%a
pause
::通过运行上面的代码后得出猜想:第一段代码由于用了tab键做分隔符,此时后面的整个token=1都会被当作分隔符列表里的一员,故此显示结果会在第一个用户名administrator的字母n出就分割了,但是如果在tab键后多加一个以上的空格字符,那么显示结果将和第二段代码的效果一样;第二段代码delims=后指定的是两个空格符(其实除了输入空格,一个以上任何多个空格都可以),此时token=1不会被解释成分隔符列表指定的分隔符,所以显示结果和用net user明显的显示结果格式完全一样,字符串未作任何分割,因为每行不存在空格字符;至于最后一段代码,delims=后面也是跳格键,同理,后面的TOKENS=1会被解释成分隔符,所以显示结果会在大写S处分割,只能显示第一个用户名,因为批处理默认区分大小写。
::总结:delims和tockens谁在前在后无关大局,但是如果delims在前的话在指定完分隔符以后一定不能忘了多加一个以上的空格符以放置系统将后面的tokens解释成分隔符。但是基于规范的代码书写要求,最好养成习惯将delims写在tokens之后。

如果把上面三段代码一起复制到bat文件里保存运行,随便敲两下键盘,结果如附件所示:

补充:
重新回头研究一下,结合论坛上已有的帖子,再次补充一下这个问题:
@echo off
for /f "delims=- tokens=3" %%a in ('date /t') do @echo %%a
pause

@echo off
for /f "tokens=4 delims=- " %%a in ('date /t') do @echo %%a
pause

::注意两段代码的delims=-后面都有个空格,表示-和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项,此时要达到想要的效果delims必须写在tokens后面。第一段代码即使在-字符后加两个空格符也没用,因为那样系统不会将空格符解释成分隔符,而是将其解释成不要将tokens也当成分隔符的标识。所以,当要明确指定用空格作为分隔符的时候,delims一定要出现在tokens之后,否则不能得偿所愿。好的书写习惯应该是先tokens后delims。

在此特别感谢随风,wxcute还有batcher的讨论,以及最后batcher给的评分,first time,3Q you all!
1

评分人数

回复 6楼 的帖子

建议把所有结论全部更新到顶楼
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

自己补充

重新回头研究一下,也看到了一下论坛上已有的帖子,在次补充一下这个问题
@echo off
for /f "delims=- tokens=3" %%a in ('date /t') do @echo %%a
pause

@echo off
for /f "tokens=4 delims=- " %%a in ('date /t') do @echo %%a
pause

::注意两段代码的delims=-后面都有个空格,表示-和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项,此时要达到想要的效果delims必须写在tokens后面。第一段代码即使在-字符后加两个空格符也没用,因为那样系统不会将空格符解释成分隔符,而是将其解释成不要将tokens也当成分隔符的标识。所以,当要明确指定用空格作为分隔符的时候,delims一定要出现在tokens之后,否则不能得偿所愿。好的书写习惯应该是先tokens后delims。

TOP

回复 3楼 的帖子

达人就是达人,能目他人之不见,闻他人之罔听。你的代码我测试过了,的确。可是为什么会这样呢?看样子如果在tokens之前用delims仅指定空格为分隔符而无其他分隔符,其实代码反而不会以空格作为分隔符,但是分隔符可以起到将tokens区别于delims分隔符列表中其他分隔符的作用,即告诉系统不要将tokens的字母当成分隔。
多谢超级版主的回复,让我更深的了解了这几个参数。

[ 本帖最后由 Lumiere 于 2009-3-19 09:32 编辑 ]

TOP

补充

sorry,2楼版主讲得对,我第二段代码不会出现错误,我写的时候写错了,是第一段出现错误。还有,我想请问下版主,到底什么时候批处理区分大小写什么时候不区分?这个问题被你一讲我有些迷惑了。

TOP

  1. @echo off
  2. set var=abc def ghi
  3. for /f "delims=  tokens=1-3" %%a in ("%var%") do (
  4.    echo.%%a
  5. )
复制代码
测试上面的代码就会发现dielims以空格作分割符时,若将delims放在tokens的前面,delims其实没起到以空格为分割的作用,还是必须把delims放在后面。
技术问题请到论坛发帖求助!

TOP

代码二并不会出现错误;
以上代码并不能得出 “因为批处理默认区分大小写” 这个结论,如 %STR:A=a% 时并不区分大小写。
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

返回列表