2016-07-15 88 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

相关问题