当在包含特殊字符的文件中使用findstr时,批处理将出错,例如<

时间:2014-06-10 11:17:57

标签: batch-file for-loop findstr

如果我的文本文件包含这样的特殊字符,如何摆脱以下错误?

Set_Param_10A "TRUE" {xnetwork[<11:0:-1>]}

如果我在文本文件中删除此行,那么我的批处理程序可以顺利运行,否则会出现以下错误:

The filename, directory, or volume label syntax is incorrect 

据我所知,这是由特殊原因引起的,例如&lt;在文件中,但我无法在文件中删除它,我只是想批处理程序忽略这个...

以下是我的代码:

@ECHO OFF
SETLOCAL

SET matchpattern="0632"

FOR /f "delims=" %%a IN (log_network.txt) DO (SET currentline=%%a & CALL :match_function)
pause

GOTO :EOF
:match_function
    ECHO %currentline%|findstr /I /R /C:"%matchpattern%" > NUL
    if %errorlevel%==0 (
        echo %currentline%
    )

log_network.txt:

Set_Param_10A "TRUE" "xnetwork.exist.5846"
Set_Param_10A "TRUE" "xnetwork.exist.7425"
Set_Param_10A "TRUE" "xnetwork.exist.1420"
Set_Param_10A "TRUE" "xnetwork.exist.0632"
Set_Param_10A "TRUE" "xnetwork.exist.1112"
Set_Param_10A "TRUE" "xnetwork.exist.8524"
Set_Param_10A "TRUE" "xnetwork.exist.3675"
Set_Param_10A "TRUE" "xnetwork.exist.3344"
Set_Param_10A "TRUE" "xnetwork.exist.1276"
Set_Param_10A "TRUE" "xnetwork.exist.4796"
Set_Param_10A "TRUE" "xnetwork.exist.3349"
Set_Param_10A "TRUE" "xnetwork.exist.0048"
Set_Param_10A "TRUE" {xnetwork[<11:0:-1>]}

3 个答案:

答案 0 :(得分:1)

您的%%a变量必须介于"之间以逃避<>字符。

试试这样:

@ECHO OFF
SETLOCAL

SET matchpattern="0632"

FOR /f "delims=" %%a IN (log_network.txt) DO CALL :match_function "%%a"
pause
GOTO :EOF

:match_function
ECHO %1 | findstr /I /R /C:"%matchpattern%" > NUL && echo %~1

答案 1 :(得分:0)

您可以选择在引号中包含您正在回显的数据

    echo("%currentline%"|findstr /I /R /C:"%matchpattern%" > NUL

但随后引号将包含在findstr的数据Feed中,您可能需要考虑它们。如果行开头或包含多个引号,它也会产生错误,因为有问题的字符可能会超出引号。

您可以使用子程序的参数

FOR /f "delims=" %%a IN (log_network.txt) DO (CALL :match_function "%%a")
....
:match_function
    echo(%1|findstr /I /R /C:"%matchpattern%" > NUL
    if %errorlevel%==0 (
        echo(%~1
    )
    goto :eof

但您还必须考虑附加引用

要避免它,您可以使用延迟扩展,但它很复杂

 @ECHO OFF
    setlocal enableextensions disabledelayedexpansion

    SET "matchpattern=0632"

    FOR /f "delims=" %%a IN (log_network.txt) DO (SET "currentline=%%a" & CALL :match_function)
    pause

    GOTO :EOF

:match_function
    (cmd /q /v:on /c "echo(!currentline!")|findstr /I /R /C:"%matchpattern%" > NUL
    if %errorlevel%==0 (
        echo(%currentline%
    )
    goto :eof

要使用变量名称将特殊字符回显到管道,您需要延迟扩展,但在管道内部,因为为管道的每个侧面创建了新流程,您无法确保cmd将执行echo的实例启用或不启用延迟扩展,因此,有必要直接生成启用了延迟扩展的实例,然后从那里回显变量,然后将数据传送到findstr

这更容易,而且通常更快

@ECHO OFF
    setlocal enableextensions disabledelayedexpansion

    SET "matchpattern=0632"

    for /f "delims=" %%a in (
        'findstr /r /i /c:"%matchpattern%" log_network.txt'
    ) do (
        echo(%%a
    )

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL

SET "matchpattern=0632"
findstr /I /R /C:"%matchpattern%" log_network.txt

但是,在这种情况下,您不需要批处理文件,只需在命令行中输入:

findstr "0632" log_network.txt

不需要/ I开关因为你没有搜索字母,所以不需要/ R开关,因为你只看“0632”文字,而不需要/ C开关,因为你看起来只是一个字符串(唯一的一个)。