我正在创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"
选项。
我不明白你的日期处理的目的,但我预先说明了它。
据推测, 2013
和2014
通过参数%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