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

时间:2017-10-09 12:09:17

标签: batch-file cmd io-redirection

我正在编写一个批处理文件,我正在运行一个由我自己编写的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

但它们都没有使我的应用程序的输出显示在同一个命令窗口中。

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

甚至可以在调用它时重定向我的应用程序的输出吗?或者它取决于应用的类型,例如控制台/ 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%
)

)

1 个答案:

答案 0 :(得分:0)

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

$script out.txt

然后您可以正常执行程序。

完成后,从键盘CRTL+D按下