我知道這是一個老問題,但在這裏是有類似問題的人一些額外的信息...
李,你爲什麼「%%一個」不能正常工作之外的推理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