2013-07-29 105 views
-1

我的文本文件包含以下行來讀取一行conatining)(閉架):無法通過批處理腳本

;  
; 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%  
    )  
)  

但是,執行此代碼時出現以下錯誤。

「雨霏在這個時候意外」

但是,如果我刪除「)」從文本文件之前雨霏,腳本執行很好,我得到想要的結果。 那麼這個「)」在這裏有什麼問題。它是否將這個「)」視爲某些命令在這裏?我該如何解決這個問題?

請幫忙。謝謝 !!

+0

注:在地方的),如果我使用任何其它特殊字符,它工作正常。所以這個「)」有一些特殊之處,這是造成這個問題的原因。 – kary

+0

如果使用特殊字符,則此處顯示的代碼將失敗,因爲'echo %% C'展開了該行,並且在新的cmd上下文(由管道創建)中失敗。但不是一個右括號,因爲它在上下文中是無害的 – jeb

回答

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

嗨foxidrive,感謝您的答覆,但變量已被分配的代碼的早期部分我沒有提到的文本文件(不想讓源代碼冗長)。我想重新迭代這個代碼工作正常,沒有括號「)」在「TEST(C)kary全局參數文件」中,即像「TEST(C kary全局參數文件」。 – kary

+0

你試過嗎?它可以正常工作在這裏,第二個只是迴應目標字符串,至於你的代碼,它不會像DO那樣獨自在線上工作,它需要在同一行後面的括號 – foxidrive

+0

嗨foxdrive,你是正確的..這段代碼不會執行,但它只是爲了簡單的目的,我發佈它的方式..'做'塊中的整個邏輯..但實際上..我正在使用子程序來分離邏輯..我的實際代碼是這樣 :FOR/F令牌^ = *^EOL^= %% C IN(%了par_file%)做撥打:process_line_single %%ç :process_line_single 集合/行=行+ 1個 回波行%行%=%* echo%* | FINDSTR/I 「TC_SERVER_NAME」> NUL: 如果 「%ERRORLEVEL%」 == 「0」( 回聲%* >>%OUTFILE% 設定值=真 轉到:EOF ) – kary

2

代碼和品嚐你貼出來,是不負責的錯誤。
只有兩個明顯的錯誤,前括號必須與FOR/F位於同一行,並且要重定向到>nul:應該只有>nul

它不輸出任何內容,但不會導致錯誤消息。

if語句無法工作,因爲%errorlevel%的擴展是在解析完整塊時完成的,而不是在執行時執行。

Foxidrives解決方案應該解決這個問題。

或者你可以試試這個

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

您好jeb..thanks爲回覆。這裏有兩點:1)左括號與FOR ...在同一行上。我使用一個子程序來獲得這個邏輯..這只是爲了簡單起見,我把邏輯放在do塊本身。 2)我用nul替換了nul,但仍然沒有效果。 3)我的另一個擔心是,如果有任何語法問題,那麼爲什麼如果Iremove從該行中刪除「)」,或者在那裏使用任何其他特殊字符而不是「)」,那麼腳本爲什麼會完美執行。 – kary

+1

這可能是您的子程序或新的命令上下文的問題。但是你顯示的代碼沒有問題,請顯示真正存在問題的代碼 – jeb

0

@jeb最後的解決方案是簡單的,最好的,但是我想向您介紹&&,使您的批處理將

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

然而,這是非常不安全,因爲文本可能包含(,<,&,|,",>字符,這將修改命令行爲。使用@jeb解決方案,而不是FOR和其他一切。更安全,更快!

+0

是的,jeb真的需要引入'&&'我假設。 ;) – mrt

0

它與enabledelayedexpanson: (I「硬編碼」的輸入和輸出文件進行測試)

@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) 
)