问题描述
-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
我认为,这是由字符串中的 -
引起的。
解决方法
您使用了锚点 ^
和 $
,它们标记了一行的开始和一行的结尾(参见 findstr docs)。
正确的模式应该是:findstr /r /c:"-param [0-9]*"
我使用了额外的标志 /c
,因此您可以在模式内使用空格,并且它们不会被视为“或”运算符。
模式很简单:首先从字面上匹配 -param
,然后用 [0-9]*
匹配零个或多个数字
这里是一个示例代码,说明如何处理不是真正的故障安全,但希望足以满足您的目的,从文本文件中读取的行在众所周知的参数字符串之后获取下一个参数字符串,例如 {{1} }.
-param
外部 FOR 循环从文本文件中逐行读取非空行,并将每一行完全分配给指定的循环变量 @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
处理传递给批处理文件的参数字符串的方式。所有空格/制表符/逗号/分号/等号/不间断空格(在 OEM 编码中)分隔的字符串都将被忽略,直到找到不区分大小写的字符串等于字符串 cmd.exe
。当前行中的下一个字符串被分配给环境变量 -param
,并使用命令 GOTO 退出两个循环,以在标签 {{1} 下方的行上继续批处理文件} 其中环境变量 ParamValue
可用于任何目的。
上面的这个扩展版本首先获取 :HaveValue
之后的字符串,它在示例 ParamValue
中。然后在整个文本文件中再次搜索以 -param
开头的参数字符串和附加的字符串,该字符串首先从示例中的文件 3
中读取。如果找到此字符串,则将下一个字符串分配给环境变量 -param
,在示例中为 -param3
。
ParaValue
要了解使用的命令及其工作原理,请打开 command prompt 窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
-
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
... 批处理文件路径总是以反斜杠结尾。 call /?
%~dp0
echo /?
endlocal /?
for /?
goto /?
if /?
rem /?