有没有办法获得/ f循环(或其他任何东西)来读取特定的行?
这是我到目前为止的代码,它读取每行的第一个单词。
@echo off
set file=readtest.txt
for /f "tokens=1 delims= " %%A in (%file%) do (echo %%A)
pause
如果有人能指出我正确的方向,我们将非常感激。
由于
附加信息:我想创建一个批处理文件,该文件将TXT文件重命名为位于特定位置的TXT文件中的字符串。我已经想出了如何重命名文件,我需要学习的是检索文件中的字符串(位于特定位置),该文件将进入该TXT文件的名称。
答案 0 :(得分: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
绕过该范围,以便{em} 实际泄露的thing
唯一的东西(应该如此)。 !..!
变量来确保它们在for
循环中得到纠正。如果没有这个,%..%
将始终扩展到for
循环开始时设置的值。最后两个要点实际上是相关的。当命令 read 而不是执行时,会扩展%..%
个变量。
对于for
循环,该命令是从for
到最终)
的整个命令。这意味着,如果你在循环中使用%line%
,那么在循环开始运行之前将对进行评估,这将导致它始终为0
(变量本身可能会改变但它的扩张已经发生了)。但是,每次在循环中遇到!line!
时都会对其进行评估,因此它将具有正确的值。
同样,虽然endlocal
通常会清除setlocal
之后创建的所有变量,但命令:
endlocal & set thing=%thing%
是扩展上下文中的单个命令。 {/ 1}}在 %thing%
运行之前已展开,这意味着它实际上变为:
endlocal
这就是为什么使用endlocal & set thing=whatever_thing_was_set_to_before_endlocal
和setlocal
是限制变量"逃避"来自范围。并且,是的,您可以链接多个endlocal & set
节以允许更多变量逃避范围。