[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
::空设备方案
set "file=%programfiles%\(te)&(st).txt"
for /f "delims=" %%a in (nul "%file%") do echo %%a
CrLf 发表于 2012-3-4 01:10

测试没有得到预想的结果
结果输出了file变量的值
而没有输出file对应的文件内容
1

评分人数

    • CrLf: 良师益友,感谢指正错误以及给与启发PB + 10 技术 + 1
天的白色影子

TOP

回复 8# CrLf
最后的结论大部分都是常识
很像是某个官方文档的描述
看来楼主的对for/f的认识有一个辗转反侧的过程
不过其中部分测试代码还是很有创意的
非常钦佩楼主的探索精神

你在9楼提到的for/f的内存泄漏问题值得关注
最近也在搜集有关for/r内存泄漏相关的资料
不知道还有没有其它比较大概率泄漏的代码案例可以提供?
天的白色影子

TOP

本帖最后由 qzwqzw 于 2012-3-19 14:37 编辑

回复 11# CrLf

“莫名奇妙”
未从代码中观察到任何异常的情况发生
倒是注意到“||(echo !a!&”似应是"||(echo !,!&"
也许是环境问题
Microsoft Windows XP [版本 5.1.2600]

usebackq的内存泄漏问题也是早前曾见过
后来想找的时候反而找不到了
给一段Google到的代码
  1. @echo off
  2. for /f "tokens=4 usebackq" %%a in ('a b c d e f g h') do echo %%a
  3. for /f "tokens=4 usebackq" %%b in ('a b c d e f g h') do echo %%b
  4. for /f "tokens=4 usebackq" %%c in ('a b c d e f g h') do echo %%c
  5. for /f "tokens=4 usebackq" %%d in ('a b c d e f g h') do echo %%d
  6. for /f "tokens=4 usebackq" %%e in ('a b c d e f g h') do echo %%e
  7. for /f "tokens=4 usebackq" %%f in ('a b c d e f g h') do echo %%f
  8. for /f "tokens=4 usebackq" %%g in ('a b c d e f g h') do echo %%g
  9. for /f "tokens=4 usebackq" %%h in ('a b c d e f g h') do echo %%h
  10. for /f "tokens=4 usebackq" %%i in ('a b c d e f g h') do echo %%i
  11. for /f "tokens=4 usebackq" %%j in ('a b c d e f g h') do echo %%j
  12. for /f "tokens=4 usebackq" %%k in ('a b c d e f g h') do echo %%k
  13. for /f "tokens=4 usebackq" %%l in ('a b c d e f g h') do echo %%l
  14. for /f "tokens=4 usebackq" %%m in ('a b c d e f g h') do echo %%m
  15. for /f "tokens=4 usebackq" %%n in ('a b c d e f g h') do echo %%n
  16. for /f "tokens=4 usebackq" %%o in ('a b c d e f g h') do echo %%o
  17. for /f "tokens=4 usebackq" %%p in ('a b c d e f g h') do echo %%p
复制代码
for/r倒是没发现内存泄漏问题
你是指for/r+ren时的文件名反复修改的问题?
或者是指for/r文件名解析的问题?
http://bbs.bathome.net/viewthread.php?tid=7629
http://bbs.bathome.net/viewthrea ... amp;page=1#pid29165
天的白色影子

TOP

回复 19# CrLf
18楼的for /f 的bug代码已经在本地测试过了
发生概率是100%,下面是测试效果

for/r确实是for/f的笔误

11楼代码的问题确实有
是我没有注意到
大概分析了下
可能是这样的原因

首先cmd的命令行长度限制是8192个字符
也就是说命令行缓冲区定义的长度是8192个双字节
排除换行符和空字符有效字符是8190个
而环境变量的长度限制8192字符只体现在变量扩展和显示时
在设置时它的变量长度收到命令行缓冲区长度的限制

其次启用变量延迟后
将不在命令行缓冲区存储环境变量的扩展结果
而采用另外一个词法分析缓冲区
这个缓冲区大概是2*8192个双字节的长度
以便于字符串的切分、合并操作的展开

再次cmd支持命令和参数开关之间
除了空格、TAB等普通分隔符之外
也可以有其它的分隔符比如 : . + / [ ] " 等
与普通的分隔符不同
这些分隔符只用于切分命令和参数
不用于参数之间的切分
是cmd为了兼容旧DOS时代的一些用法而做的hack措施
而且它们在词法切分后不会被剔除
所以它们既是分隔符又是操作符
因此在做了命令与参数切分之后
参数串中仍然保留该字符

第四set命令的参数中
很多常见的命令分隔符都会发生转义
TAB、空格、分号、逗号等成为普通字符
等号除了第一个是操作符之外其它也成为普通字符
因此set后的逗号在分隔了set命令和参数之后
继续作为set的参数之一——用作变量名
天的白色影子

TOP

回复 25# CrLf
这只是对cmd命令行分析过程中的半成品
有些不太确认的结论
我会加注意“可能”、“大致”、“也许”等类似的字样
还有些结论因为需要深入分析和多方面确认
包括set对, / + 等分隔符处理上的不同
所以暂时还没有办法贴出来
天的白色影子

TOP

返回列表