如何在某行某行中的特定字符串之后从文本文件中获取数字?

How to get a number from a text file after a specific string in one of the lines somewhere on the line?

我有一个包含以下两行的文本文件:

-host MYPC -param 3 -param2 4
-host MYPC -param3 2 -param4 5

我想在 Windows 批处理文件中获取 -param 对应的值 3 (-param 3)。

我尝试使用 findstr 命令,如下所示:

findstr /R "^-param$" > step1_a.txt my_file.txt

但是它输出这个:

FINDSTR: /c ignored
FINDSTR: /A ignored
FINDSTR: /f ignored
FINDSTR: /f ignored
FINDSTR: /t ignored
FINDSTR: /y ignored
FINDSTR: /a ignored
FINDSTR: /k ignored

我想,这是由字符串中的-造成的。

如何在我的文本文件中获取与 -param 关联的值 3

您使用了锚 ^$ 来标记一行的开始和结束(参见 findstr docs)。

正确的模式是:findstr /r /c:"-param [0-9]*"

我使用了附加标志 /c,因此您可以在模式中使用空格,它们不会被视为“或”运算符。

模式很简单:首先按字面意思匹配-param ,然后用[0-9]*

匹配零个或多个数字

这里是一个示例代码,说明如何处理不是真正的故障安全,但希望足以满足您的目的,从文本文件读取的行在众所周知的参数字符串(如 [=)之后获取下一个参数字符串12=].

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "DataFile=%~dp0my_file.txt"

rem Does the input data file exist?
if exist "%DataFile%" goto ProcessData
rem Input data file not found in directory of the batch file.
echo ERROR: Could not find file: "%DataFile%"
goto :EOF

:ProcessData
set "ParamValue="
for /F usebackq^ delims^=^ eol^= %%I in ("%DataFile%") do for %%J in (%%I) do (
    if not defined ParamValue (
        if /I "%%~J" == "-param" set "ParamValue=1"
    ) else (set "ParamValue=%%~J" & goto HaveValue)
)
rem The parameter of interest was not found at all or there is no value.
echo ERROR: Could not find the parameter with name: "-param"
goto :EOF

:HaveValue
rem Output the parameter value as an example for further command lines.
set ParamValue

endlocal

外层FOR循环从文本文件中一个接一个地读取非空行,并将每一行完全分配给指定的循环变量I.

内部 FOR 循环处理当前行的方式类似于 cmd.exe 处理传递给批处理文件的参数字符串的方式。所有 space/tab/comma/semicolon/equal sign/non-breaking space(在 OEM 编码中)分隔的字符串都将被忽略,直到找到不区分大小写的等于字符串 -param 的字符串。当前行中的下一个字符串被分配给环境变量 ParamValue 并且使用命令 GOTO 退出两个循环以继续在标签下方的行上进行批处理文件 :HaveValue 其中环境变量 ParamValue 可以用于任何目的。

上面的扩展版本首先获取 -param 之后的字符串,在示例 3 中。然后再次在整个文本文件中搜索以 -param 开头的参数字符串和首先从示例中的文件 -param3 中读取的附加字符串。如果找到此字符串,则将下一个字符串分配给环境变量 ParaValue,在示例中为 2

@echo off
set "DataFile=%~dp0my_file.txt"

rem Does the input data file exist?
if exist "%DataFile%" goto ProcessData
rem Input data file not found in directory of the batch file.
echo ERROR: Could not find file: "%DataFile%"
goto :EOF

:ProcessData
set "ParamName="
for /F usebackq^ delims^=^ eol^= %%I in ("%DataFile%") do for %%J in (%%I) do (
    if not defined ParamName (
        if /I "%%~J" == "-param" set "ParamName=1"
    ) else (set "ParamName=-param%%~J" & goto HaveName)
)
rem The parameter of interest was not found at all or there is no value.
echo ERROR: Could not find the parameter with name: "-param"
goto :EOF

:HaveName
set "ParamValue="
for /F usebackq^ delims^=^ eol^= %%I in ("%DataFile%") do for %%J in (%%I) do (
    if not defined ParamValue (
        if /I "%%~J" == "%ParamName%" set "ParamValue=1"
    ) else (set "ParamValue=%%~J" & goto HaveValue)
)
rem The parameter of interest was not found at all or there is no value.
echo ERROR: Could not find the parameter with name: "%ParamName%"
goto :EOF

:HaveValue
rem Output the parameter value as an example for further command lines.
set ParamValue

endlocal

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /? ... 解释 %~dp0 ... 批处理文件路径始终以反斜杠结尾。
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?