1、普通for语句会忽略以分号开头的文本:
test.txt内容:
测试代码:
此陷阱在不用for的 type test.txt、more test.txt和findstr .* test.txt 语句中不存在。
2、在for语句中使用带 tokens=1* delims=: 的 findstr /n .* test.txt 的时候,会过滤掉行首的所有冒号:
test.txt同1;
测试代码:
解决问题1和问题2的通用方案:
稍微复杂一点的:
最简洁的(经测试,这个方案不具备通用性,因为"delims= eol=" 会把行首为引号的内容过滤掉,看来真是前门驱虎后门进狼、引号和分号不能兼顾啊):
简洁方案中的"delims= eol=" 顺序不能颠倒,否则会出现偏差。
不知道强大的 for 还会有哪些陷阱会让不明就里的我们往里跳,请各位收集一下,以便日后编写代码的时候能少走弯路。
[ Last edited by namejm on 2007-5-17 at 09:17 PM ]
test.txt内容:
;abc
ai
::te
,te st
test
测试代码:
@echo off
for /f "delims=" %%i in (test.txt) do echo %%i
pause
此陷阱在不用for的 type test.txt、more test.txt和findstr .* test.txt 语句中不存在。
2、在for语句中使用带 tokens=1* delims=: 的 findstr /n .* test.txt 的时候,会过滤掉行首的所有冒号:
test.txt同1;
测试代码:
@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /n .* test.txt') do echo %%j
pause
解决问题1和问题2的通用方案:
稍微复杂一点的:
@echo off
for /f "delims=" %%i in ('findstr /n .* test.txt') do (
set "str=%%i"
call set "str=%%str:*:=%%"
call echo "%%str%%"
)
pause
最简洁的(经测试,这个方案不具备通用性,因为"delims= eol=" 会把行首为引号的内容过滤掉,看来真是前门驱虎后门进狼、引号和分号不能兼顾啊):
@echo off
for /f "delims= eol=" %%i in (test.txt) do echo %%i
pause
简洁方案中的"delims= eol=" 顺序不能颠倒,否则会出现偏差。
不知道强大的 for 还会有哪些陷阱会让不明就里的我们往里跳,请各位收集一下,以便日后编写代码的时候能少走弯路。
[ Last edited by namejm on 2007-5-17 at 09:17 PM ]
本帖最近评分记录
(共 1 条)
点击查看详情
| 评分人 | 分数 | 时间 |
|---|---|---|
| ccwan | +15 | 2007-01-25 05:39 |
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
考虑问题复杂化,解决问题简洁化。
