Batch file 如何重定向批处理文件中调用的exe的输出?

Batch file 如何重定向批处理文件中调用的exe的输出?,batch-file,cmd,io-redirection,Batch File,Cmd,Io Redirection,我目前正在编写一个批处理文件,其中运行的exe是我自己编写的。我正在重定向标准输出以及特定文件中的标准错误输出 批处理文件中的我的命令如下所示: "MyExe.exe" /weekly config.xml > "C:\MyPath\testlog.log" 2>&1 只要我从命令行执行命令,一切正常。我的应用程序的输出显示在同一命令窗口中。然后,testlog.log包含我刚才在命令窗口中看到的所有输出 当我从批处理文件运行它时,除了批处理文件打开的命令窗口之外,还会打开

我目前正在编写一个批处理文件,其中运行的exe是我自己编写的。我正在重定向标准输出以及特定文件中的标准错误输出

批处理文件中的我的命令如下所示:

"MyExe.exe" /weekly config.xml > "C:\MyPath\testlog.log" 2>&1
只要我从命令行执行命令,一切正常。我的应用程序的输出显示在同一命令窗口中。然后,testlog.log包含我刚才在命令窗口中看到的所有输出

当我从批处理文件运行它时,除了批处理文件打开的命令窗口之外,还会打开一个新的第二个窗口,显示我的应用程序的输出。应用程序完成后,第二个窗口将关闭,并执行批处理文件中的其余操作。日志文件本身是空的

我已经知道有不同的进程,一个进程的输出不能重定向到另一个进程

这就是为什么我在批处理文件中使用
start
命令,让输出显示在批处理文件打开的命令窗口中

我已经尝试过这些解决方案:

start /wait /b "MyExe.exe" /weekly config.xml > "C:\MyPath\testlog.log" 2>&1

start /b "C:\FullPath\MyExe.exe" /weekly config.xml > "C:\MyPath\testlog.log" 2>&1
但它们都不能使我的应用程序的输出显示在同一个命令窗口中

此外,我已经尝试了来自和问题的所有解决方案。我总是得到一个空输出或一个空文件

这样调用应用程序时,是否可以重定向其输出?还是取决于应用程序的类型,例如控制台/windows应用程序

编辑:这是我的批处理文件:

SET LOGS_LOCAL="C:\MyAgent\EXE\logs\*.log"
SET LOGS_SERVER="\\MyServer\Backups\weekly\logs"

SET SOURCE_ARCHIVES="C:\MyAgent\Backups\weekly\*.zip"
SET TARGET_ARCHIVES_SERVER="\\MyServer\Backups\weekly"
SET CONFIGFILE="config.xml"

SET COUNTER=0
SET MAXLOGS=30

SET Timestamp=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
echo %Timestamp%
pause

REM Run the exe
"MyExe.exe" /weekly %CONFIGFILE% > "C:\MyAgent\EXE\logs\log %Timestamp%.log" 2>&1

pause

REM Check return value of exe
IF %ERRORLEVEL% EQU 0 OR %ERRORLEVEL% GEQ 8 (

REM Get latest local archive and copy on server
FOR /F "delims=|" %%I IN ('DIR %SOURCE_ARCHIVES% /B /O:D /S') DO SET NewestArchive=%%I
copy "%NewestArchive%" %TARGET_ARCHIVES_SERVER%

REM Get local count of logs
for %%A in (%LOGS_LOCAL%) do set /a COUNTER+=1

REM Delete oldest log whne maximum is reached
IF %COUNTER% LEQ %MAXLOGS% (
REM Everything fine, no work to be done
) else (
REM Get oldest log
FOR /f "delims=|" %%a in ('dir %LOGS_LOCAL% /t:c /a:-d /o:-d /b /s') do set OldestLog="%%a"

REM Delete oldest log
DEL %OldestLog%
)

)

可以通过以下方式使用脚本命令:

$script out.txt
然后你可以正常执行你的程序


完成后,从键盘按CRTL+D键。您可以通过以下方式使用脚本命令:

$script out.txt
然后你可以正常执行你的程序


完成后,从键盘按[code>CRTL+D

您的exe文件是一个控制台应用程序,对吗?您不应该使用
START
,只使用与命令行中相同的批处理命令。@LS_ᴅᴇᴠ 是的,我的exe是一个控制台应用程序。我已尝试在批处理文件的命令行中使用相同的命令,但在执行任务时日志仍然为空。如果是这样,请使用提升的权限启动批处理。您的命令行
start…>重定向“开始”输出,该输出为“无”,您的应用程序正在另一个窗口中输出。我不确定,现在无法测试,但我认为使用UAC,exe将在新窗口/进程中启动,就像
START
,批处理窗口中不会收到任何输出。您的exe文件是控制台应用程序,对吗?您不应该使用
START
,只使用与命令行中相同的批处理命令。@LS_ᴅᴇᴠ 是的,我的exe是一个控制台应用程序。我已尝试在批处理文件的命令行中使用相同的命令,但在执行任务时日志仍然为空。如果是这样,请使用提升的权限启动批处理。您的命令行
start…>
重定向“无”的开始输出,您的应用程序正在另一个窗口中输出。我不确定,现在无法测试,但我认为使用UAC时,exe会在新窗口/进程中启动,就像
START
,批处理窗口中不会收到任何输出。