我知道这是一个老问题,但在这里是有类似问题的人一些额外的信息...
李,你为什么“%%一个”不能正常工作之外的推理for循环是正确的。 %a-z和%A-Z变量(批处理文件中的%% a-z)是for循环的结构,不存在于其外部。
我想推荐一个替代的解决方案来匹配正确的行号(没有空行跳过)并且不需要延迟扩展,计数器或goto语句。看看下面的代码:
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "c:\file_list.txt"') do if "%%a"=="%1" set line=%%b
echo.%line%
这是什么让我对上述变化。比方说,你有以下文件的内容:
Some text on line 1
Blah blah blah
More text
我做的第一件事就是改变(C:\ file_list.txt)。为了('FINDSTR/N *“C:\ file_list.txt “')。
- 'FINDSTR/N。* “路径\文件名”' 读取文件,并添加了行号( '/N ')的每一个线(' 。*' 是一个正则表达式匹配任何字符的“0或更多”)。由于每行现在都有一个行号(即使是空行),for循环也不会跳过任何行。
每行现在看起来像这里面的for循环:
1:Some text on line 1
2:Blah blah blah
3:More text
接下来,我们使用“令牌= 1 * delims =:”打破了行号和内容。
- “令牌= 1 *”设定第一令牌定界符之前(存储在%%一个)的一切,和第二令牌(存储在%% b)至所有后。
- 'delims =:'设置为“:”作为用于分隔字符串的分隔符。现在
,我们遍历文件,%%一个将返回当前行号和%% b将返回该行的内容。
所有剩下的就是比较%1参数%%一个(而不是一个计数器变量),并使用%% b存储当前行内容:如果“%%一个” ==“%1”set line = %% b。
另外一个好处是,“enabledelayedexpansion”不再是必要的,由于上述代码消除读取的中间为循环计数器变量。
编辑:改变 '回波%线路%' 到 '回波%线路%。'。这将正确显示空白行,而不是“ECHO关闭”。更改'键入c:\ file_list.txt^|因为findstr命令已经可以直接读取文件了,所以可以使用“filestr/n。*”到“findstr/n。*”c:\ file_list.txt“”。
杰布,我想我已经解决了所有特殊问题。给这一个镜头:
for /f "tokens=*" %%a in ('findstr /n .* "c:\file_list.txt"') do (
set "FullLine=%%a"
for /f "tokens=1* delims=:" %%b in ("%%a") do (
setlocal enabledelayedexpansion
set "LineData=!FullLine:*:=!"
if "%%b" equ "%1" echo(!LineData!
endlocal
)
)
请注意'for/f'会跳过空行。在某些情况下,这可能也可能会使您的计数失效。 – Joey 2010-04-24 10:02:52