如果我的文本文件包含这样的特殊字符,如何摆脱以下错误?
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>]}
答案 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开关,因为你看起来只是一个字符串(唯一的一个)。