gpt4 book ai didi

batch-file - 批处理 - 如何从批处理脚本本身重定向 stderr 和 stdout?

转载 作者:行者123 更新时间:2023-12-04 02:06:17 24 4
gpt4 key购买 nike

在 Unix shell 脚本中,可以从内部脚本本身重定向 stderr 和 stdout,如下所示:

#!/bin/ksh
# script_name: test.sh
export AUTO_LOGFILE=`basename $0 .sh`.log
# stdout and stderr Redirection. This will save the old stdout on FD 3, and the old stderr on FD 4.
exec 3>&0 4>&1 >>$AUTO_LOGFILE 2>&1
echo "Hello World"
# The above echo will be printed to test.log

实际上,test.sh 可以简单地执行为:

test.sh

代替:

test.sh >> test.log 2>&1    

我正在尝试在批处理脚本中执行类似的操作。我的批处理代码如下:

@echo off & setlocal enableextensions enabledelayedexpansion
REM script_name=test.bat
set AUTO_LOGFILE=%~n0.log
REM How to do the stdout and stderr redirection from within the script itself here?

如何从批处理脚本本身重定向 stderr 和 stdout?我更感兴趣的是将此 unix shell 脚本语句转换为等效的批处理代码:

exec 3>&0 4>&1 >>$AUTO_LOGFILE 2>&1

最佳答案

下面的 test.bat 批处理文件在功能上等同于您的 Unix 脚本,也就是说,它将所有标准输出发送到日志文件并将错误输出发送到屏幕:

@echo off
if defined reEntry goto reEntry
set reEntry=TRUE

set AUTO_LOGFILE=%~N0.log
rem stdout Redirection. Leave stderr as is.

"%~F0" %* >>%AUTO_LOGFILE%

:reEntry
set reEntry=
echo "Hello World"
rem The above echo will be printed to test.log
rem and error messages will be printed to the screen:
verify badparam

附录:

我以为 OP 想要将 stdout 与 stderr 分开以便在屏幕上看到错误消息,但也许我误解了他。要将 stdout 和 stderr 都发送到文件,请使用下面的行,正如 dbenham 在他的评论中指出的那样:

"%~F0" %* >>%AUTO_LOGFILE% 2>&1

或者以上面评论中已经建议的更简单的方式:

@echo off
set AUTO_LOGFILE=%~N0.log
rem stdout and stderr Redirection.

call :Main %* >>%AUTO_LOGFILE% 2>&1
goto :EOF

:Main
echo "Hello World"
rem The above echo will be printed to test.log

但是,如果目的是从正常输出中区分错误消息,则可以通过以下技巧在同一屏幕中完成:

"%~F0" %* 2>&1 1>&3 | findstr /N /A:4E "^"

通过这种方式,错误消息前面会显示红色背景上的黄色行号。有几种情况可以直接使用该方法;例如,在任何编程语言源程序的编译中:

anycompiler %1 2>&1 1>&3 | findstr /N /A:4E "^"

关于batch-file - 批处理 - 如何从批处理脚本本身重定向 stderr 和 stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com