我正在创建一个批处理文件,用于在LOG文件中搜索字符串。该字符串包含两个静态和两个动态部分。动态部分是我们在运行时输入的内容。我在批处理脚本本身中连接静态和动态部分,并在文件中搜索它。
例如,如果静态字符串是“hello world |”和“|”
动态字符串是“2013”和“2014”,我的最后一个字符串就像
finalstring =你好世界| 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
我的批处理文件的输出如下:
2013-02-25
2013
2014
'2013' is not recognized as an internal or external command,operable program or batchfile
我的假设是存在一个连接字符串并且在“finalstring”中没有正确调用参数的错误
有人可以帮我解决这个问题吗?
提前致谢!
答案 0 :(得分:0)
有时您必须打开和关闭延迟扩展,但您确实应该尝试构建代码以最小化次数。你的代码已经过分了。
您无法使用%~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