使用输出重定向在脚本中启动可执行文件

时间:2014-12-02 17:02:08

标签: batch-file redirect

我有一个用于启动和停止服务的批处理脚本。整个脚本封装在子程序中,以便我可以输出重定向:

call :sub >> C:\Users\Administrator\Desktop\output%LogFilename%.txt
@exit /b 0

:sub

.

start cgsservice.exe -c config\cgs.json

.

我遇到的问题是,在使用脚本启动服务后,我再次运行脚本以停止服务。我收到以下错误:

该进程无法访问该文件,因为该文件正由另一个进程使用。

我知道问题是什么,但我不知道如何解决它。问题是重定向到日志文件,因为服务正在运行它不会让我再次运行脚本,因为它无法访问output%LogFilename%.txt文件。我手动终止服务我无法再次运行脚本。任何想法如何解决这个问题没有摆脱重定向

1 个答案:

答案 0 :(得分:0)

在进程运行时,您将无法“回收”日志文件。相反,你将不得不停止锁定它的进程。您可以在致电:sub

之前添加此行来自动停止
REM Stop any running instances of the service.
REM This is needed to release the lock on the log file.
TaskKill /im cgsservice.exe /f

请注意,这与强制终止应用程序相同,因此我不确定它可能会产生什么影响。您可以尝试不使用/f开关(将尝试正常关闭)来查看进程是否以此方式停止。

您的另一个选择是为 cgsservice.exe 进程提供单独的日志文件,但我不确定这将如何适合您的工作流程。要实现此目的,请更新以下行:

call :sub >> C:\Users\Administrator\Desktop\output%LogFilename%_cgsservice.txt

请注意,执行此操作会导致备用日志文件锁定,直到 cgsservice.exe 进程终止。您可以使用与上述相同的TaskKill语句来停止它。

如果要检查 cgsservice.exe 是否未启动,然后启动它,则应执行此操作:

FOR /F "usebackq tokens=* delims=" %%A IN (`TaskList /FI "IMAGENAME eq cgsservice.exe"`) DO (
    REM Check against the result of TaskList when no matches are found.
    IF "%%A"=="INFO: No tasks are running which match the specified criteria." (
        REM Service is not started. Start it now.
        START cgsservice.exe -c config\cgs.json
    )
)