无法使用findstr命令调用参数

我正在创build一个batch file,将searchLOG文件中的string。 该string包含两个静态部分和两个dynamic部分。 dynamic部分是我们在运行时input的。 我将批处理脚本中的静态和dynamic部分连接起来,并在文件中进行search。

例如,如果静态string是“hello world |”和“|”

dynamicstring是“2013”​​和“2014”,我的最后一个string是

finalstring = hello world | 2013 | 2014

为了消除双引号,我使用延迟扩展。 这是我的代码如下:

@echo off For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) echo %mydate% setlocal DisableDelayedExpansion set "str=%~1" setlocal EnableDelayedExpansion echo !str! setlocal DisableDelayedExpansion set "str2=%~2" setlocal EnableDelayedExpansion echo !str2! setlocal DisableDelayedExpansion set "string1=hello world | " set "string1=%~string1" setlocal EnableDelayedExpansion echo !string1! setlocal DisableDelayedExpansion set "pipesign= | " set "pipesign=%~pipesign" setlocal EnableDelayedExpansion echo !pipesign! :concat set "finalstring=%string1%%str%" set "finalstring2=%finalstring%%pipesign%" set "finalstring3=%finalstring2%%str2%" echo %finalstring3% :concat findstr %finalstring3% C:\test\log20132502 

我的batch file的输出如下所示:

 2013-02-25 2013 2014 '2013' is not recognized as an internal or external command,operable program or batchfile 

我的假设是有一个连接string的错误,并且在“finalstring”中没有正确调用参数

任何人都可以请帮助我这个?

提前致谢!

有些时候,您必须开启和关闭延迟扩展,但是您应该尝试构建您的代码以减少次数。 你的代码太过分了。

您不能使用%~var 〜var从变量值中删除引号。 这只适用于参数,如%~1或FOR变量,如在%%~A 。 您编写代码的方式不需要删除引号。 set "var=value"具有引号以保护赋值期间的值,但引号不包含在值中。

你的错误信息源于管道必须在你的FINDSTR行中引用(或转义)的事实。

FINDSTR将把搜索字符串分割成多个搜索字符串,用空格分隔。 您希望在搜索字符串中包含空格,所以您需要FINDSTR /C:"search string"选项。

我不明白你的日期处理的目的,但我预先说明了它。

据推测, 20132014通过参数%1%2

我相信你的代码可以简化如下:

 @echo off setlocal enableDelayedExpansion for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) echo %mydate% set "mySearch=hello world | %~1 | %~2" echo !mySearch! findstr /c:"!mySearch!" c:\test\log20132502 

如果%1%2的值能够包含! ,那么在mySearch分配过程中,延迟的扩展将会破坏这个值。 切换延迟扩展可以帮助在这种情况下。

 @echo off setlocal disableDelayedExpansion for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) echo %mydate% set "mySearch=hello world | %~1 | %~2" setlocal enableDelayedExpansion echo !mySearch! endlocal findstr /c:"!mySearch!" c:\test\log20132502 

但我怀疑搜索字符串的打印输出仅用于调试目的。 如果你不需要变量或者搜索字符串的输出,那么你的代码就可以简单地变成

 @echo off setlocal disableDelayedExpansion for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) echo %mydate% findstr /c:"hello world | %~1 | %~2" c:\test\log20132502