DOS批处理命令读取文本文件中的一些信息

5

我正在尝试使用Windows命令行从文本文件中读取一些信息,并将其保存到一个变量中,就像"set info=1234"一样。

以下是txt文件的内容,实际上我只需要修订号,它始终位于第5行,从第11列到第15列。在示例中,它是1234,我想知道是否有一种方法可以将其保存到Dos命令行中的一个变量中。

非常感谢!

svninfo.txt:

Path: .
URL: https://www.abc.com
Repository Root: https://www.abc.com/svn
Repository UUID: 12345678-8b61-fa43-97dc-123456789
Revision: 1234
Node Kind: directory
Schedule: normal
Last Changed Author: abc
Last Changed Rev: 1234
Last Changed Date: 2010-04-01 18:19:54 -0700 (Thu, 01 Apr 2010)
5个回答

11

以下是一种一行代码的版本:

for /f "tokens=2" %%i in ('findstr Revision: input.txt') do set revision=%%i
  1. findstr用于筛选文件。它将打印出"input.txt:Revision: 1234"
  2. 然后, "tokens=2" 表示我们对第二个标记“1234”感兴趣,默认情况下会根据空格进行分隔。

非常聪明!我忘记了findstr。 - Dan Story
补充一点:你应该使用正则表达式匹配,并将“Revision:”字符串锚定到行的开头。你永远不知道它是否会出现在其他地方 :-) - Joey
@Johannes 希望你使用 fidnstr /R 来启用正则表达式。 - Jay Bazuzi

4
以下代码片段展示了如何实现这一点:
@echo off
setlocal enableextensions enabledelayedexpansion
set revision=
for /f "delims=" %%a in (input.txt) do (
    set line=%%a
    if "x!line:~0,10!"=="xRevision: " (
        set revision=!line:~10!
    )
)
echo !revision!
endlocal

它的输出结果是1234,正如所期望的那样。

setlocal 是我在每个脚本中都使用的命令,确保变量以已知的方式处理。 for 语句处理输入文件中的每一行(delims 部分防止将该行分解为单独的词语)。

!line:~ 的部分是子字符串,其中 !line:~0,10! 是前十个字符,!line:~10! 是其余部分。

因此,基本上,它会检查每一行是否以"Revision: "开头,如果是,则提取后面的内容供稍后使用。


我个人会选择 findstr 变体。这样做可以使意图更加清晰,并且稍微缩短了代码长度,因为你不必使用子字符串来检查行的开头。 - Joey
已经有一段时间了,但我记得我喜欢将 @SETLOCAL 放在第一行,这样 @ECHO OFF 不会影响调用脚本的回显设置。此外,我喜欢用 @IF NOT DEFINED _ECHO ECHO OFF 替换 @ECHO OFF,这样我就可以使用 SET _ECHO=1 来调试我的脚本。 - Jay Bazuzi

2

使用for命令分析文件:

for /f "skip=4 tokens=2" %%l in (svninfo.txt) do (
    set revision=%%l
    goto gotrev
)

:gotrev
echo revision is %revision%

简洁明了,但是paxdiablo的版本可能更好一些,因为它实际上会检查要返回的数据是否符合规范,而不仅仅依赖于行号。 - Dan Story

1

如果您可以使用GNU工具,例如gawk

@echo off
for /F %%a in ('gawk -F":" "$1~/Revision/{print $2}" file') do (
        set var=%%a
)
echo %var%

1

熟练掌握CMD脚本编写是很好的,但使用PowerShell更好。以下是一种方法:

$revision = (( gc .\svninfo.txt | ? { $_.StartsWith( 'Revision: ' ) } ) -split ' ')[1]

发生了什么事?

$revision 是一个变量。

gc 表示 Get-Content,也叫做type。文件中的每一行都成为序列(管道)中的字符串。

?Where-Object。它根据条件过滤管道中的对象。

{} 分隔脚本块。

$_ 是管道中的当前对象。

-split 在 .NET 中调用 String.Split(),并给出一个对象数组。

[1] 索引到数组中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接