无法通过批处理脚本读取包含(行括号)的行

时间:2013-07-29 08:43:40

标签: batch-file

我的文本文件包含以下行:

;    
; TEST (C)kary global parameters file    
;    
;===================================================================   
; Test servers list    
;===================================================================    
TC_SERVER_NAME test123   
TC_SERVER_TITLE Tc_test    

我使用以下代码行来读取行并获取TC_SERVER_NAME行。

FOR /f tokens^=*^ eol^= %%C IN (%TEST_FILE%) do    
(    
    echo %%C | findstr /i "TC_SERVER_NAME" >nul:    
    if "%errorlevel%"=="0" (    
    echo %%C >> %OUTFILE%    
    )    
)

但是,执行此代码时出现以下错误。

  

“此时卡里出人意料”

但是,如果我从文本文件中删除kary之前的“)”,脚本执行正常,我得到了所需的结果。 那么这个“)”在这里有什么问题。是否将“)”视为某些命令?我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

您发布的代码和示例不对错误负责 只有两个明显的错误,左括号必须与FOR/F位于同一行,而>nul:的重定向应仅为>nul

它不输出任何内容,但不会导致错误消息。

if语句不起作用,因为%errorlevel%的扩展在解析完整块时完成,而不是在执行时完成。

Foxidrives解决方案应该解决这个问题。

或者你可以试试这个

findstr /i "TC_SERVER_NAME" %TEST_FILE% > %OUTFILE%

答案 1 :(得分:1)

这有帮助吗?

FOR /f tokens^=*^ eol^= %%C IN (%TEST_FILE%) do (    
    echo %%C | findstr /i "TC_SERVER_NAME" >nul
    if "%errorlevel%"=="0" >> %OUTFILE% echo %%C
)    

你可能想要这个:

@echo off
set test_file=source.txt
set outfile=out.txt
FOR /f tokens^=*^ eol^= %%C IN (%TEST_FILE%) do (    
    echo %%C | findstr /i "TC_SERVER_NAME" >nul && >> %OUTFILE% echo %%C
)    

答案 2 :(得分:0)

@jeb最后一个解决方案更简单,最好,但我想向您介绍&&,所以您的批次将是

FOR /f "tokens=* eol=" %%C IN (%TEST_FILE%) do echo %%C | findstr /i "TC_SERVER_NAME" >nul && echo %%C >> %OUTFILE%

但是,这非常不安全,因为文字可能包含(<&|">个字符,这将修改命令行为。使用@jeb解决方案,而不是FOR和其他所有内容。更安全,更快!

答案 3 :(得分:0)

它适用于enabledelayedexpanson: (我“硬编码”输入和输出文件进行测试)

@echo off
setlocal enabledelayedexpansion

FOR /f "tokens=* eol=" %%C IN (t.t) do  (    
    echo %%C | findstr /i "TC_SERVER_NAME" >nul:    
    if "!errorlevel!"=="0" ( echo %%C >> o.o )  
)