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

Command line DOS批处理命令从文本文件中读取一些信息,command-line,batch-file,dos,Command Line,Batch File,Dos,我试图使用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:

我试图使用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)

以下代码段显示了如何执行此操作:

@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位阻止该行被标记为单独的字)

!行:~
位是带有
的子字符串!线:~0,10是前十个字符和
!排队:~10是其余的


因此,基本上,它会检查每一行,看它是否以
“Revision:”
开头,如果是,则提取该行的其余部分供以后使用。

使用
for
命令解析文件:

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

:gotrev
echo revision is %revision%

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


这是一个单线版本:

for /f "tokens=2" %%i in ('findstr Revision: input.txt') do set revision=%%i
  • findstr用于筛选文件。它将打印“input.txt:Revision:1234”
  • 那么“tokens=2”表示我们对第二个token“1234”感兴趣。默认情况下,用于空白处的打断

  • 知道如何熟练地使用CMD脚本非常好,但使用PowerShell更好。这里有一种方法:

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

    $revision
    是一个变量

    gc
    获取内容
    ,也称为
    类型
    。文件中的每一行都成为序列(管道)中的字符串

    其中的对象
    。它根据条件过滤管道中的对象

    {}
    分隔脚本块

    $是管道中的当前对象

    -split
    调用.NET中的
    String.split()
    ,为您提供一个对象数组


    [1]
    索引到数组中

    简洁,是的,但是paxdiablo的版本可能是一个更好的选择,因为它实际上检查它将返回的数据是否一致,而不是仅仅依靠行号。非常聪明!我忘记了findstr。要补充一点:您可能应该使用正则表达式匹配,并将
    修订版:
    字符串锚定到行的开头。你永远不会知道它是否也会出现在其他地方:-)@Johannes希望你使用
    fidnstr/R
    来启用regex。不过,我个人会使用
    findstr
    变量。由于不必检查带有子字符串的行的开头,因此使意图更加清晰,并且略短。已经有一段时间了,但IIRC我喜欢将
    @SETLOCAL
    放在第一行,因此
    @ECHO OFF
    不会影响调用脚本的ECHO设置。此外,我喜欢将
    @ECHO OFF
    替换为
    @如果未定义_echoecho OFF
    ,这样我就可以使用
    设置_ECHO=1
    来调试脚本。
    $revision = (( gc .\svninfo.txt | ? { $_.StartsWith( 'Revision: ' ) } ) -split ' ')[1]