修改批处理脚本以有条件地写入文件
问题描述:
我有一个批处理文件从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”将是一个更好的字符串...
该解决方案的工作。但是会在文件中追加空行。但它的工作谢谢。 – user646108 2013-05-02 14:16:43
嗨@peter,提示和命令也被刷新到文件中。像这样: C:\> echo LOGMESSAGE bbbbbbbb LOGMESSAGE bbbbbbbb 在这种情况下是否可以只获得实际的输出LOGMESSAGE bbbbbbbb? – user646108 2013-05-02 14:31:01
有趣。也许这是一个操作系统版本的差异。我使用的是WIN7,并在每个原始文件中插入了一个“DIR”列表,然后是带有已更改的“FOR”块的文件。除了排除不同的字符串(其中一个文件名),我没有添加空行。好奇... – Magoo 2013-05-02 14:32:29