批处理文件 - 读取特定行,并将该行中的特定字符串保存为变量

时间:2016-07-15 01:39:07

标签: windows batch-file

有没有办法获得/ f循环(或其他任何东西)来读取特定的行?

这是我到目前为止的代码,它读取每行的第一个单词。

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

如果有人能指出我正确的方向,我们将非常感激。

由于

附加信息:我想创建一个批处理文件,该文件将TXT文件重命名为位于特定位置的TXT文件中的字符串。我已经想出了如何重命名文件,我需要学习的是检索文件中的字符串(位于特定位置),该文件将进入该TXT文件的名称。

1 个答案:

答案 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节以允许更多变量逃避范围。