2014-06-10 236 views
0

)的文件中使用findstr時批處理將發生錯誤如果我的文本文件包含特殊字符(如此),如何擺脫下面的錯誤?在包含特殊字符(如<

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

如果我刪除在文本文件中這一行,那麼我的批處理程序都能流暢運行,否則就會給下面的錯誤:

The filename, directory, or volume label syntax is incorrect 

我所知,這是造成由特殊這種在文件中<,但我不能夠在文件中刪除此,我只想批處理程序忽略這個...

下面是我的代碼:

@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>]} 

回答

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 
+0

我可以知道爲什麼%% a不等於「%% a」? 沒有遵循你在匹配函數中修改的內容,但只添加了%% a的雙引號,我能夠很容易地從錯誤中刪除...謝謝...但不是盲目追隨,我希望知道爲什麼我需要把「」? –

+0

如果你不在''''<'and '>'之間放置'%% a',char將被解釋爲重定向字符。這就是爲什麼你會得到一個錯誤。 – SachaDee

+0

你可以看看這裏:http://www.robvanderwoude .COM/escapechars.php – SachaDee

0

你必須放在引號,你是呼應

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

但隨後的行情將包括在數據饋送中FINDSTR數據的選項,你可能必須考慮到它們。如果這些行開始或包含多個引號,則它們也會出現錯誤,因爲有問題的字符可能會脫離引號。

您可以使用參數子程序

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 

但你也必須要考慮aditional的報價

爲了避免它,你可以使用延遲擴展,但它是複雜的

@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 

要使用變量名稱將特殊字符回顯到管道,需要延遲擴展,但在管道內部,因爲會爲每個邊創建一個新進程您不能確保將執行echocmd實例啓用或不啓用延遲擴展,因此,需要直接產生啓用了延遲擴展的實例,然後從那裏回顯該變量,然後將數據傳送到管道到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 
    ) 
0
@ECHO OFF 
SETLOCAL 

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

然而,在這種情況下,你並不需要一個批處理文件,只需在命令行輸入:

findstr "0632" log_network.txt 

/I開關不需要,因爲您不搜索字母,/ R開關不是必需的,因爲您只需查看「0632」文字,並且不需要/ C開關,因爲您只需查看一個字符串(唯一一個)。