单实例批处理文件?

lan*_*nce 2 windows batch-file single-instance

:: dostuff.bat
@echo off
:: insert long-running process call here
: End
Run Code Online (Sandbox Code Playgroud)

如果它在执行时已经在另一个进程中运行,我可以添加到此批处理文件中以使其终止?

Joe*_*oey 8

好吧,如果只有一个实例,那么你可以通过在某个地方创建一个虚拟文件来实现这一点,可能在temp目录中:

copy NUL "%TEMP%\dostuff_is_doing_stuff.tmp"
Run Code Online (Sandbox Code Playgroud)

然后在完成后将其删除:

del "%TEMP%\dostuff_is_doing_stuff.tmp"
Run Code Online (Sandbox Code Playgroud)

在批处理文件的开头,您可以检查该文件是否存在并相应地退出:

if exist "%TEMP%\dostuff_is_doing_stuff.tmp" (
    echo DoStuff is already running. Exiting ...
    exit /b 1
)
Run Code Online (Sandbox Code Playgroud)

同样,您可以通过更改窗口标题来实现这一点,窗口标题对于Ctrl+ C'ed或崩溃的批处理文件也应该更加健壮.

设置标题:

title DoStuff
Run Code Online (Sandbox Code Playgroud)

之后重新设置:

title Not doing stuff
Run Code Online (Sandbox Code Playgroud)

检查一下:

tasklist /FI "WINDOWTITLE eq DoStuff"
Run Code Online (Sandbox Code Playgroud)

但是,这有一个问题:当cmd以管理员身份运行时,您将获得"Administrator:DoStuff"作为标题.哪个不再匹配了tasklist.您也可以通过检查"Administrator:DoStuff"来解决它,但根据Windows UI语言可能会有所不同,因此它可能不是最佳解决方案.