修改批处理脚本以有条件地写入文件

修改批处理脚本以有条件地写入文件

问题描述:

我有一个批处理文件从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 

... 
:: 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