中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请帮我解释一下for语句中的delims=" ,谢谢
作者:
标题: 请帮我解释一下for语句中的delims=" ,谢谢 上一主题 | 下一主题
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『楼 主』:  请帮我解释一下for语句中的delims=" ,谢谢

内容中的delims=这一句如果是delims=\" 我知道是以\作为分隔符,但它后面什么都没有是什么意思?百思不得其解.望高手解答,不盛感激,还请把红色部分都解释一下好吗?拜托了.
@echo off&setlocal EnableDelayedExpansion
set a=1
for /f "delims=" %%i in ('dir /a-d/b/s *.txt') do (
        if not "%%~ni"=="%~n0" (
        ren "%%i" "%%~ni!a!%%~xi"
        set/a a+=1
        )
)


2006-12-24 06:16
查看资料  发短消息 网志   编辑帖子
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  


  Re 26933062 :

  for里面的delims指定分隔符,这里没有指定分隔符,就代表任何字符都不是分割符,再一想,就表示取一行的整个内容了,不管它里面有什么符号。

  %%~ni,相关的见for的帮助命令,里面有。


2006-12-24 06:28
查看资料  发送邮件  发短消息 网志   编辑帖子
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 3 楼』:  

lxmxn
先谢谢你解答,
如果这样那么我干脆不写它不就行了?象以下内容一样,会有什么不妥的吗?
我试了试,程序能正常运行,只是不知道会不会在某种其它环境下出问题.
还有就是红色部分,怎么只用单%号呢?
@echo off&setlocal EnableDelayedExpansion
set a=1
for /f  %%i in ('dir /a-d/b/s *.txt') do (
        if not "%%~ni"=="%~n0" (
        ren "%%i" "%%~ni!a!%%~xi"
        set/a a+=1
        )
)


2006-12-24 06:36
查看资料  发短消息 网志   编辑帖子
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  


  Re 26933062 :

  如果你去掉了delims选项,那么当文件含有空格等符号时,程序可能达不到你要的效果,甚至会出错。

  红色部分的%~n0代表的是批处理自身的文件名,这样,这个批处理本身就不会被重命名。


2006-12-24 08:00
查看资料  发送邮件  发短消息 网志   编辑帖子
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 5 楼』:  

  for /f 语句中,默认以空格或者制表符(也就是按tab键产生的8个空格的字符)为分隔符,如果不指定 delims 的值的话,就表示以空格或者制表符为分隔符。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-24 11:07
查看资料  发短消息 网志   编辑帖子
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 6 楼』:  

感谢,长知识.

2006-12-24 13:12
查看资料  发短消息 网志   编辑帖子
earth123xinyuan
社区乞丐





积分 -46
发帖 25
注册 2009-2-9
来自 内蒙
状态 离线
『第 7 楼』:  

似懂非懂,慢慢学吧

2009-2-11 03:02
查看资料  发送邮件  发短消息 网志  OICQ (340458053)  编辑帖子
5yue5
初级用户





积分 69
发帖 34
注册 2009-2-8
状态 离线
『第 8 楼』:  12345

去看这里的实例
http://www.cn-dos.net/forum/viewthread.php?tid=46126&fpage=2
"delims="
文本文件的内容for把它的每一行分成若干段。分段的符号叫定界符,系统默认是空格。
delims就是define limite定义界限的意思。"delims=  "就是说定界是一空格符号把每行划分
为若干段。这是系统默认,此时可以不要delims=空格,也是一样的。如果这句改成delims=k,妈妈每行就按字母k划分为若干段。for默认只抓取每行的第一段进入内存,进行运算。
比如说*.txt的内容是
  11 12 13
  21 22 23
  31 32 33  
则for抓取的就是
  11
  21
  31
特别注意 你这句里面for不会抓取整行的数据。只会抓取每行的第一段!如果你要让for抓取整行的
数据的话,你得添点破坏剂,就是 tokens=*
”%%~ni“
这里n来自英文name即名字的意思。~符号代表删除双引号。所以  ”%%~ni“就是指把参数%%i读取的文件名加以拓广。如何拓广?比如说%%i 如果代表的是文件名123456.txt,那么%%~ni就代表: 123456
而%%~xi就代表: .txt(x就是extended扩展的意思)
if not "%%~ni"=="%~n0" 就是:如果%%~ni 从%i获得的文件名字不等于 %~n0从%0获得的文件名字
(不含扩展名)则怎么怎么样。

[ Last edited by 5yue5 on 2009-2-15 at 22:56 ]

2009-2-15 22:30
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: