由於您尚未完全定義「某個特定位置」的含義,因此我會提出一些(在我看來是合理的)假設,儘管我提出的方法同樣有效,不管您的定義如何成爲。
通過將行計數器變量與tokens
結合使用,可以在該行上獲得任意行和任意字。
假設您的文本文件名可以作爲infile.txt
文件第四行的第二個參數找到。你可以得到的東西,如:
@setlocal enableextensions enabledelayedexpansion
@echo off
set /a "line = 0"
for /f "tokens=2 delims= " %%a in (infile.txt) do (
set /a "line = line + 1"
if !line!==4 set thing=%%a
)
endlocal & set thing=%thing%
echo %thing%
這實際上使用了一些「招數」,這需要進一步的解釋:
- 的
line
計數器,以確保你只抓住你想要的東西從特定儘管您可以將測試!line!==4
更改爲您需要的任何內容,例如以#
開頭的行,第五行包含字符串xyzzy
等等。
- 使用
setlocal/endlocal
有效地給你一個變量不能泄漏的範圍。這是良好的編程習慣甚至經常不能正常使用這樣的事情相關的:-)
- 使用
endlocal & set
到旁路一種語言,範圍,使thing
是不實際上泄漏的唯一的事情(因爲它應該) 。
- 使用延遲擴展和
!..!
變量確保它們在for
循環內正確。沒有這個,%..%
將始終擴展到for
循環開始時設置的值。
最後兩個要點實際上是相關的。 %..%
變量在命令爲時讀取爲,而不是在執行時擴展。
對於for
循環,該命令是從for
到最終)
的整個事情。也就是說,如果在循環中使用%line%
,那麼將在之前評估循環開始運行,這將導致它始終爲0
(變量本身可能會更改,但其擴展已經發生)。但是,每次在循環中遇到!line!
時都會被評估,因此將具有正確的值。
類似地,雖然endlocal
通常會清楚出setlocal
之後創建的所有變量,命令:
endlocal & set thing=%thing%
是在擴張的上下文中,單命令。該%thing%
爲endlocal
運行前擴充,有效地意思就變成:
endlocal & set thing=whatever_thing_was_set_to_before_endlocal
這就是爲什麼使用setlocal
和endlocal & set
是限制變量從範圍「逃脫」一個非常有用的方式。而且,是的,您可以鏈接多個節,以允許更多變量逃離範圍。
是否有特殊原因使用'&&'(「運行commandA,如果成功然後運行commandB」)而不是'&'(「運行commandA然後運行commandB」)? [參考](http://ss64.com/nt/syntax-redirection.html) – Stephan
@Stephan,不是真的,如果'endlocal'可能會失敗,這只是一個問題,我不相信是這種情況。然而,我可能更願意使用'&&'以免混淆任何查看它的UNIX bods,因爲'&'在UNIX-land中提供* * * * *不同,並且我意識到它們的有限心理容量[只是開玩笑,但我會躲在封面以防萬一:-)]。 – paxdiablo
我注意到廣泛的錯誤觀點,'&&'意味着「然後做」批量(而不是正確的「如果這是成功的,然後做」)。儘管這裏可能沒有任何區別,但它可以在另一個環境中產生巨大的影響。快速瀏覽一下你的聲譽,我最好問,以防我錯過了什麼。我不能說關於unix-guys的心理能力 - 我們在幾年前殺死了所有人[也是躲避] – Stephan