|
|
FOR命令空格符和跳格符做分隔符的区别以及delims的位置选择
在本人机器上运行net user结果如下:
\\LUMIERE_DENG 的用户帐户
-------------------------------------------------------------------------------
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! |
评分
-
查看全部评分
|