2016-07-15 94 views
0

有什麼辦法可以獲得/ f循環(或其他)來讀取特定行?批處理文件 - 讀取特定行,並將該行中的特定字符串保存爲變量

這是我到目前爲止的代碼,它讀取每行的第一個字。

@echo off 
set file=readtest.txt 
for /f "tokens=1 delims= " %%A in (%file%) do (echo %%A) 
pause 

如果有人可以指出我在正確的方向,它將不勝感激。

感謝

附加信息:我想編寫一個批處理文件,該文件將TXT文件重命名爲TXT文件中的一個字符串,位於特定位置。我已經想出瞭如何重命名文件,我需要學會做的是檢索一個字符串(位於特定的位置)與文件中的文件,該文件將進入該TXT文件的名稱。

回答

0

由於您尚未完全定義「某個特定位置」的含義,因此我會提出一些(在我看來是合理的)假設,儘管我提出的方法同樣有效,不管您的定義如何成爲。

通過將行計數器變量與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 

這就是爲什麼使用setlocalendlocal & set是限制變量從範圍「逃脫」一個非常有用的方式。而且,是的,您可以鏈接多個節,以允許更多變量逃離範圍。

+0

是否有特殊原因使用'&&'(「運行commandA,如果成功然後運行commandB」)而不是'&'(「運行commandA然後運行commandB」)? [參考](http://ss64.com/nt/syntax-redirection.html) – Stephan

+0

@Stephan,不是真的,如果'endlocal'可能會失敗,這只是一個問題,我不相信是這種情況。然而,我可能更願意使用'&&'以免混淆任何查看它的UNIX bods,因爲'&'在UNIX-land中提供* * * * *不同,並且我意識到它們的有限心理容量[只是開玩笑,但我會躲在封面以防萬一:-)]。 – paxdiablo

+2

我注意到廣泛的錯誤觀點,'&&'意味着「然後做」批量(而不是正確的「如果這是成功的,然後做」)。儘管這裏可能沒有任何區別,但它可以在另一個環境中產生巨大的影響。快速瀏覽一下你的聲譽,我最好問,以防我錯過了什麼。我不能說關於unix-guys的心理能力 - 我們在幾年前殺死了所有人[也是躲避] – Stephan

相關問題