bat避免重复运行

2024-04-03 0 1
手机查看

方法一:

@echo off 2>nul 3>>"%~f0"
type "%~f0"

rem 脚本内容...

方法二:

@echo off

set SCRIPT_NAME=%~nx0
set COUNT=
for /F "delims=" %%i in ('wmic process get Caption^,CommandLine ^| find /i "%SCRIPT_NAME%" ^| find /v /c "find.exe"') do (
    set COUNT=%%i
)
if %COUNT% GTR 1 (
    echo 监控进程已存在
    exit /B 1
)

rem 脚本主体内容...

方法三:

@echo off
set SCRIPT_NAME=%~nx0
set MARK_FILE="%TEMP%\%SCRIPT_NAME%.lock"

:: 创建守护进程
start "" cmd /c "%~dp0cleanup.bat" "%MARK_FILE%"
:: 检查 lock 文件
if exist "%MARK_FILE%" (
    echo 脚本 %SCRIPT_NAME% 已经启动!
    exit /B 1
)

echo 脚本开始运行 > "%MARK_FILE%"
rem 脚本主体内容...

:: 脚本结束时通知守护进程清理 lock 文件
echo 脚本结束 >> "%MARK_FILE%"

goto :eof

:: 清理守护进程脚本 cleanup.bat
:: 守护进程持续监测 lock 文件,当发现文件中有“脚本结束”字样时,删除 lock 文件
:: 并终止自身进程
:cleanup
set MARK_FILE=%1
:loop
timeout /T 1 /NOBREAK > nul
if exist "%MARK_FILE%" (
    for /F "tokens=*" %%i in (%MARK_FILE%) do (
        if "%%i"=="脚本结束" (
            del "%MARK_FILE%"
            exit
        )
    )
)
goto loop

这段代码仅供参考,因为 cleanup.bat 还要判断主进程是否结束,只有主进程结束后才能清理 MARK_FILE,可以和方法二结合,达到更健壮的目的。

What do you think?
  • 点赞
    0
    点赞
  • 踩一下
    0
    踩一下
  • 酷毙了
    0
    酷毙了
  • 不屑
    0
    不屑
  • 尴尬
    0
    尴尬
  • 无聊
    0
    无聊
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.5.6