我有一个用于启动和停止服务的批处理脚本。整个脚本封装在子程序中,以便我可以输出重定向:
call :sub >> C:\Users\Administrator\Desktop\output%LogFilename%.txt
@exit /b 0
:sub
.
start cgsservice.exe -c config\cgs.json
.
我遇到的问题是,在使用脚本启动服务后,我再次运行脚本以停止服务。我收到以下错误:
该进程无法访问该文件,因为该文件正由另一个进程使用。
我知道问题是什么,但我不知道如何解决它。问题是重定向到日志文件,因为服务正在运行它不会让我再次运行脚本,因为它无法访问output%LogFilename%.txt
文件。我手动终止服务我无法再次运行脚本。任何想法如何解决这个问题没有摆脱重定向
答案 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
)
)