我有一个文本文件,其中包含以下两行:
-host MYPC -param 3 -param2 4
-host MYPC -param3 2 -param4 5
我想获取与
-param
对应的值,即 Windows 批处理文件中的 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
我想,这是字符串中的
-
造成的。
如何在我的文本文件中获取与
3
关联的值 -param
?
这里是一个示例代码,说明如何处理并非真正的故障安全,但希望足以满足您的目的,从文本文件读取的行以获取众所周知的参数字符串(如
-param
)之后的下一个参数字符串。
@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%"
exit /B
: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"
exit /B
:HaveValue
rem Output the parameter value as an example for further command lines.
set ParamValue
endlocal
外部 FOR 循环从文本文件中逐个读取非空行,并将每一行完全分配给指定的循环变量
I
。
内部 FOR 循环处理当前行,类似于
cmd.exe
处理传递到批处理文件的参数字符串。所有空格/制表符/逗号/分号/等号/不间断空格(在 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%"
exit /B
: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"
exit /B
: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%"
exit /B
:HaveValue
rem Output the parameter value as an example for further command lines.
set ParamValue
endlocal
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
... 解释 %~dp0
... 批处理文件路径始终以反斜杠结尾。echo /?
endlocal /?
exit /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?
您使用了锚点
^
和 $
来标记行的开头和行的结尾(请参阅 findstr 文档)。
正确的模式是:
findstr /r /c:"-param [0-9]*"
我使用了附加标志
/c
,因此您可以在模式内使用空格,并且它们不会被视为“或”运算符。
模式很简单:首先从字面上匹配
-param
,然后用[0-9]*
匹配零个或多个数字