2

我正在创建一个批处理文件,它将在 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”中未正确调用该参数

谁能帮我解决这个问题?

提前致谢!

4

1 回答 1

0

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

您不能使用%~var从变量值中删除封闭引号。这仅适用于参数,如 in%~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

如果%1or的值%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
于 2013-02-25T20:09:05.177 回答