2013-05-02 122 views
0

我有一個批處理文件從Internet複製下面。 需要一些幫助。 批處理從命令或其他批處理中獲取輸出,並將輸出回顯到控制檯和指定文件。迴應到控制檯是好的,但是有沒有辦法只在條件滿足時才寫入文件?如果回顯文本包含一些字符串,可能是「LOGMESSAGE」。 因此,如果2條消息被命令或批處理響應,則返回 消息1:「你好,你好嗎?」 消息2:「LOGMESSAGE謝謝,我很好。」修改批處理腳本以有條件地寫入文件

消息1應該只在控制檯上顯示,消息2應該在控制檯和文件中顯示。要被記錄

@ECHO OFF 
:: Check Windows version 
IF NOT "%OS%"=="Windows_NT" GOTO Syntax 

:: Keep variables local 
SETLOCAL 

:: Check command line arguments 
SET Append=0 
IF /I [%1]==[-a] (
    SET Append=1 
    SHIFT 
) 
IF  [%1]==[] GOTO Syntax 
IF NOT [%2]==[] GOTO Syntax 

:: Test for invalid wildcards 
SET Counter=0 
FOR /F %%A IN ('DIR /A /B %1 2^>NUL') DO CALL :Count "%%~fA" 
IF %Counter% GTR 1 (
    SET Counter= 
    GOTO Syntax 
) 

:: A valid filename seems to have been specified 
SET File=%1 

:: Check if a directory with the specified name exists 
DIR /AD %File% >NUL 2>NUL 
IF NOT ERRORLEVEL 1 (
    SET File= 
    GOTO Syntax 
) 

:: Specify /Y switch for Windows 2000/XP COPY command 
SET Y= 
VER | FIND "Windows NT" > NUL 
IF ERRORLEVEL 1 SET Y=/Y 

:: Flush existing file or create new one if -a wasn't specified 
IF %Append%==0 (COPY %Y% NUL %File% > NUL 2>&1) 

:: Actual TEE 
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
    > CON ECHO.%%B 
    >> %File% ECHO.%%B 
) 

:: Done 
ENDLOCAL 
GOTO:EOF 


:Count 
SET /A Counter += 1 
SET File=%1 
GOTO:EOF 


:Syntax 
ECHO. 
ECHO Tee.bat, Version 2.11a for Windows NT 4/2000/XP 
ECHO Display text on screen and redirect it to a file simultaneously 
ECHO. 
IF NOT "%OS%"=="Windows_NT" ECHO Usage: some_command ¦ TEE.BAT [ -a ] filename 
IF NOT "%OS%"=="Windows_NT" GOTO Skip 
ECHO Usage: some_command ^| TEE.BAT [ -a ] filename 
:Skip 
ECHO. 
ECHO Where: "some_command" is the command whose output should be redirected 
ECHO   "filename"  is the file the output should be redirected to 
ECHO   -a    appends the output of the command to the file, 
    ECHO      rather than overwriting the file 
    ECHO. 
ECHO. 
ECHO Written by Rob van der Woude 
ECHO http://www.robvanderwoude.com 
ECHO Modified by Kees Couprie 
ECHO http://kees.couprie.org 
ECHO and Andrew Cameron 

回答

0
... 
:: Actual TEE 
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
    > CON ECHO.%%B 
    echo "%%B"|find "LOGMESSAGE" >nul 
    IF ERRORLEVEL 1 >> %File% ECHO.%%B 
) 
... 

額外FIND企圖定位該消息中的目標串。如果找到,errorlevel將被設置爲0,否則不爲0。

不要嘗試使用語法"if %errorlevel%==0"在這裏,因爲它在一份聲明中塊和結構不會解釋從發現錯誤級別,但因爲它站在當FOR被解析。


爲了抑制 「不寫入日誌」 標誌時,嘗試

::實際TEE SETLOCAL enabledelayedexpansion FOR/F 「令牌= 1 * delims =]」 %% A IN(」 FIND/N/V 「」')DO( SET消息= %%乙 IF定義的消息SET消息=消息:!!=的LogMessage

CON ECHO(消息 IF 「%% B」 ==「!message!」>>%File%ECHO(%% B ) ENDLOCAL

應該刪除字符串「logmesssage」(在兩種情況下)和 - 這一點似乎顛倒 - 無法登錄該行的文件,但送線,與標誌「的LogMessage」使勁,到控制檯。也許「skiplog」將是一個更好的字符串...

+0

該解決方案的工作。但是會在文件中追加空行。但它的工作謝謝。 – user646108 2013-05-02 14:16:43

+0

嗨@peter,提示和命令也被刷新到文件中。像這樣: C:\> echo LOGMESSAGE bbbbbbbb LOGMESSAGE bbbbbbbb 在這種情況下是否可以只獲得實際的輸出LOGMESSAGE bbbbbbbb? – user646108 2013-05-02 14:31:01

+0

有趣。也許這是一個操作系統版本的差異。我使用的是WIN7,並在每個原始文件中插入了一個「DIR」列表,然後是帶有已更改的「FOR」塊的文件。除了排除不同的字符串(其中一個文件名),我沒有添加空行。好奇... – Magoo 2013-05-02 14:32:29