无法使用findstr命令调用参数

时间:2013-02-25 13:21:33

标签: windows batch-file

我正在创建一个批处理文件,用于在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”中没有正确调用参数的错误

有人可以帮我解决这个问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

有时您必须打开和关闭延迟扩展,但您确实应该尝试构建代码以最小化次数。你的代码已经过分了。

您无法使用%~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