如何在某行某行中的特定字符串之后从文本文件中获取数字?
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 /?
我有一个包含以下两行的文本文件:
-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 /?