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

时间:2010-04-02 23:01:53

标签: 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: 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 个答案:

答案 0 :(得分:11)

这是一行版本:

for /f "tokens=2" %%i in ('findstr Revision: input.txt') do set revision=%%i
  1. findstr用于过滤文件。它将打印“input.txt:Revision:1234”
  2. 然后“令牌= 2”意味着我们对第二个令牌“1234”感兴趣。默认为空白处的休息。

答案 1 :(得分: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: "开头,如果是,则提取该行的其余部分以供日后使用。

答案 2 :(得分:2)

使用for命令解析文件:

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

:gotrev
echo revision is %revision%

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

知道如何巧妙地使用CMD脚本非常棒,但使用PowerShell会更好。这是一种方法:

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

发生了什么事?

$revision是变量

gcGet-Content,又名type。文件中的每一行都成为序列(管道)中的字符串。

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

{}分隔脚本块

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

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

[1]索引到数组