最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

批處理中判斷進(jìn)程是否運(yùn)行,運(yùn)行則退出,防止bat重復(fù)運(yùn)行的bat代碼

 更新時(shí)間:2026年04月06日 18:56:13   投稿:mdxy-dxy  
最近執(zhí)行一些bat程序,為了防止bat重復(fù)運(yùn)行導(dǎo)致問題,,下面的批處理腳本,用于判斷自身(或指定進(jìn)程)是否已經(jīng)在運(yùn)行,如果已在運(yùn)行則退出

功能:判斷自身是否正在運(yùn)行,如果已經(jīng)運(yùn)行,就直接退出,不重復(fù)啟動(dòng)。

單文件完整代碼(直接復(fù)制保存為 .bat 即可)

下面是一個(gè)批處理腳本,用于判斷自身(或指定進(jìn)程)是否已經(jīng)在運(yùn)行,如果已在運(yùn)行則退出:

方法一:通過臨時(shí)文件判斷(簡(jiǎn)單實(shí)用)

@echo off
setlocal enabledelayedexpansion
:: ==============================================
:: 功能:判斷當(dāng)前批處理是否正在運(yùn)行
:: 如果已經(jīng)運(yùn)行,則自動(dòng)退出,不重復(fù)啟動(dòng)
:: ==============================================
:: 定義一個(gè)唯一鎖文件名
set "LOCK_FILE=%temp%\my_batch_running.lock"
:: 判斷鎖文件是否存在
if exist "%LOCK_FILE%" (
    echo 批處理已在運(yùn)行,自動(dòng)退出...
    pause
    exit /b
)
:: 創(chuàng)建鎖文件(標(biāo)記正在運(yùn)行)
echo running > "%LOCK_FILE%"
:: ==================== 你的業(yè)務(wù)代碼開始 ====================
echo 批處理已啟動(dòng)
echo 正在執(zhí)行任務(wù)...
pause
:: ==================== 你的業(yè)務(wù)代碼結(jié)束 ====================
:: 程序結(jié)束后刪除鎖文件
del "%LOCK_FILE%" 2>nul
endlocal

核心原理

  • 啟動(dòng)時(shí)創(chuàng)建一個(gè)臨時(shí)鎖文件
  • 再次運(yùn)行時(shí),檢測(cè)到鎖文件存在 → 直接退出
  • 正常關(guān)閉時(shí)自動(dòng)刪除鎖文件,不影響下次啟動(dòng)

如果你想要【完全靜默、不彈窗】版本

@echo off
set "LOCK_FILE=%temp%\my_batch_running.lock"
if exist "%LOCK_FILE%" exit /b
echo running > "%LOCK_FILE%"
:: 你的代碼
del "%LOCK_FILE%" 2>nul

比較推薦的一個(gè)代碼

@echo off
set "lockfile=%temp%\%~nx0.lock"
:: 檢查鎖文件是否存在
if exist "%lockfile%" (
    echo 程序已在運(yùn)行中,即將退出...
    timeout /t 2 >nul
    exit /b
)
:: 創(chuàng)建鎖文件
echo %date% %time% > "%lockfile%"
:: 正常執(zhí)行你的腳本內(nèi)容
echo 腳本開始執(zhí)行...
pause
:: 腳本結(jié)束時(shí)刪除鎖文件
del "%lockfile%" 2>nul

需要確認(rèn)%temp%目錄有讀取寫入權(quán)限,主要是服務(wù)器中需要注意,也可以換個(gè)目錄,比較好,比較臨時(shí)目錄很多安全設(shè)置軟件會(huì)禁止。

那么代碼就可以這么寫

@echo off
set "lockfile=%~dp0\%~nx0.lock"
:: 檢查鎖文件是否存在
if exist "%lockfile%" (
    echo 程序已在運(yùn)行中,即將退出...
    timeout /t 2 >nul
    exit /b
)
:: 創(chuàng)建鎖文件
echo %date% %time% > "%lockfile%"
:: 正常執(zhí)行你的腳本內(nèi)容
echo 腳本開始執(zhí)行...
pause
:: 腳本結(jié)束時(shí)刪除鎖文件
del "%lockfile%" 2>nul

方法二:判斷自身批處理進(jìn)程

@echo off
title MyBatchScript
:: 獲取當(dāng)前批處理腳本的進(jìn)程ID
set "current_pid=%random%"
for /f "tokens=2" %%a in ('tasklist /fi "imagename eq cmd.exe" /nh 2^>nul') do (
    echo %%a | findstr /i "%current_pid%" >nul 2>nul || (
        :: 檢查是否是當(dāng)前腳本
        wmic process where "processid=%%a" get commandline | findstr /i "%~nx0" >nul 2>nul
        if !errorlevel! equ 0 (
            set /a count+=1
        )
    )
)
if %count% gtr 1 (
    echo 程序已在運(yùn)行中,即將退出...
    timeout /t 2 >nul
    exit /b
)
:: 正常執(zhí)行你的腳本內(nèi)容
echo 腳本開始執(zhí)行...
pause

方法三:判斷特定進(jìn)程名(如 notepad.exe)

主要針對(duì)運(yùn)行的exe文件名,方便bat調(diào)用一些exe文件的時(shí)候

@echo off
set "process_name=notepad.exe"
:: 檢查進(jìn)程是否運(yùn)行
tasklist /fi "imagename eq %process_name%" 2>nul | findstr /i "%process_name%" >nul
if %errorlevel% equ 0 (
    echo %process_name% 已在運(yùn)行中,即將退出...
    timeout /t 2 >nul
    exit /b
)
:: 正常執(zhí)行你的腳本內(nèi)容
echo %process_name% 未運(yùn)行,繼續(xù)執(zhí)行...
start notepad.exe

方法四:使用標(biāo)簽和進(jìn)程列表(推薦用于復(fù)雜場(chǎng)景)

@echo off
set "scriptname=%~nx0"
:: 獲取當(dāng)前腳本的進(jìn)程數(shù)
set "count=0"
for /f "skip=3 tokens=1-2" %%a in ('tasklist /fi "imagename eq cmd.exe" /fo table /nh 2^>nul') do (
    for /f "tokens=*" %%c in ('wmic process where "processid=%%b" get commandline ^| findstr /i "%scriptname%" 2^>nul') do (
        set /a count+=1
    )
)
if %count% gtr 1 (
    echo 檢測(cè)到腳本已在運(yùn)行中,數(shù)量:%count%
    echo 即將退出...
    ping -n 3 127.0.0.1 >nul
    exit /b
)
echo 腳本正常運(yùn)行...
:: 在這里添加你的主要代碼
pause

注意事項(xiàng):

方法一(鎖文件法)最簡(jiǎn)單可靠,但如果在腳本運(yùn)行過程中異常終止,鎖文件可能不會(huì)被刪除

方法二和方法四更精確,但需要 WMIC 支持(Windows 7 及以上系統(tǒng))

如果使用鎖文件法,建議在腳本開頭添加清理邏輯:

:: 清理超過24小時(shí)的舊鎖文件
forfiles /p "%temp%" /m "%~nx0.lock" /d -1 /c "cmd /c del @file" 2>nul

選擇最適合你需求的方法即可。對(duì)于大多數(shù)情況,方法一(鎖文件法) 是最簡(jiǎn)單實(shí)用的選擇。

清理超過20分鐘的舊鎖文件

使用 forfiles 清理超過20分鐘的舊鎖文件,由于 forfiles 的 /d 參數(shù)只支持天數(shù),不支持分鐘,所以需要換一種方法。以下是幾種解決方案:

方法一:使用 forfiles 配合文件時(shí)間比較(推薦)

batch

@echo off
set "lockfile=%temp%\%~nx0.lock"
:: 清理超過20分鐘的鎖文件
forfiles /p "%temp%" /m "%~nx0.lock" /c "cmd /c if @isdir==FALSE (for /f \"tokens=1-6 delims=/: \" %%a in ('echo @fdate @ftime') do (call :CheckTime \"%%a-%%b-%%c %%d:%%e:%%f\"))" 2>nul
:: 或者使用更簡(jiǎn)單的方法:檢查文件修改時(shí)間
if exist "%lockfile%" (
    for %%a in ("%lockfile%") do (
        set "filetime=%%~ta"
        set "now=%date% %time%"
        REM 這里需要復(fù)雜的時(shí)間計(jì)算,建議使用方法二
    )
)
goto :main
:CheckTime
REM 這個(gè)方法比較復(fù)雜,建議使用下面的方法二
exit /b

方法二:使用 PowerShell(最精確)

batch

@echo off
set "lockfile=%temp%\%~nx0.lock"
:: 使用PowerShell檢查并刪除超過20分鐘的鎖文件
powershell -Command "& {
    $file = '%lockfile%';
    if (Test-Path $file) {
        $filetime = (Get-Item $file).LastWriteTime;
        $agetime = (Get-Date) - $filetime;
        if ($agetime.TotalMinutes -gt 20) {
            Remove-Item $file -Force;
            Write-Host '已刪除超過20分鐘的鎖文件';
        }
    }
}" 2>nul
:: 檢查鎖文件是否存在
if exist "%lockfile%" (
    echo 程序已在運(yùn)行中(鎖文件存在且未超過20分鐘),即將退出...
    timeout /t 2 >nul
    exit /b
)
:: 創(chuàng)建新鎖文件
echo %date% %time% > "%lockfile%"
:main
:: 正常執(zhí)行你的腳本內(nèi)容
echo 腳本開始執(zhí)行...
pause
:: 腳本結(jié)束時(shí)刪除鎖文件
del "%lockfile%" 2>nul

方法三:使用 VBScript(無需PowerShell)

創(chuàng)建 checklock.vbs 文件:

vbs

' checklock.vbs
Set fso = CreateObject("Scripting.FileSystemObject")
lockfile = WScript.Arguments(0)
If fso.FileExists(lockfile) Then
    Set file = fso.GetFile(lockfile)
    filetime = file.DateLastModified
    ageminutes = DateDiff("n", filetime, Now)
    If ageminutes > 20 Then
        fso.DeleteFile lockfile, True
        WScript.Echo "Deleted old lock file"
        WScript.Quit 0  ' 文件已刪除,可以繼續(xù)
    Else
        WScript.Echo "Lock file is recent, exiting"
        WScript.Quit 1  ' 文件存在且未過期
    End If
Else
    WScript.Quit 0  ' 文件不存在,可以繼續(xù)
End If

在批處理中調(diào)用:

batch

@echo off
set "lockfile=%temp%\%~nx0.lock"
:: 調(diào)用VBScript檢查并清理鎖文件
cscript //nologo "%~dp0checklock.vbs" "%lockfile%"
if %errorlevel% equ 1 (
    echo 程序已在運(yùn)行中(鎖文件存在且未超過20分鐘),即將退出...
    timeout /t 2 >nul
    exit /b
)
:: 創(chuàng)建新鎖文件
echo %date% %time% > "%lockfile%"
:: 正常執(zhí)行你的腳本內(nèi)容
echo 腳本開始執(zhí)行...
pause
:: 腳本結(jié)束時(shí)刪除鎖文件
del "%lockfile%" 2>nul

方法四:純批處理實(shí)現(xiàn)(無需額外工具)

batch

@echo off
setlocal enabledelayedexpansion
set "lockfile=%temp%\%~nx0.lock"
:: 檢查并清理超過20分鐘的鎖文件
if exist "%lockfile%" (
    for /f "tokens=1-2 delims= " %%a in ('dir /tc "%lockfile%" ^| findstr "%lockfile%"') do (
        set "filedate=%%a"
        set "filetime=%%b"
    )
    :: 獲取當(dāng)前時(shí)間
    set "now=%date% %time%"
    :: 這里簡(jiǎn)化處理,實(shí)際需要復(fù)雜的時(shí)間計(jì)算
    REM 建議使用前面幾種方法,純批處理處理時(shí)間差很復(fù)雜
    REM 作為替代,可以使用臨時(shí)文件方式
    echo 鎖文件已存在,但無法精確判斷20分鐘
    echo 如需精確判斷,請(qǐng)使用PowerShell或VBScript方法
)
:: 簡(jiǎn)單方案:檢查文件是否超過20分鐘(近似)
if exist "%lockfile%" (
    for %%a in ("%lockfile%") do set "filetime=%%~ta"
    REM 需要復(fù)雜的字符串處理,不推薦
)
goto :main

推薦方案:使用 PowerShell(最簡(jiǎn)潔)

batch

@echo off
set "lockfile=%temp%\%~nx0.lock"
:: 使用PowerShell檢查和清理(單行命令)
powershell -Command "if (Test-Path '%lockfile%') { $t=(Get-Item '%lockfile%').LastWriteTime; if (((Get-Date)-$t).TotalMinutes -gt 20) { Remove-Item '%lockfile%' -Force } }" 2>nul
:: 檢查鎖文件是否仍然存在
if exist "%lockfile%" (
    echo 程序已在運(yùn)行中(鎖文件存在且未超過20分鐘)
    echo 如果確認(rèn)程序未運(yùn)行,請(qǐng)手動(dòng)刪除文件:%lockfile%
    timeout /t 3 >nul
    exit /b
)
:: 創(chuàng)建新鎖文件
echo %date% %time% - Process ID: !random! > "%lockfile%"
echo 腳本開始執(zhí)行...
:: 你的主要代碼在這里
pause
:: 清理
del "%lockfile%" 2>nul

說明:

方法二(PowerShell) 最簡(jiǎn)單精確,Windows 7及以上系統(tǒng)默認(rèn)支持

方法三(VBScript) 適合沒有PowerShell的環(huán)境

純批處理處理分鐘級(jí)時(shí)間差非常復(fù)雜,不推薦

選擇 PowerShell 方法即可完美實(shí)現(xiàn)清理超過20分鐘的舊鎖文件。

相關(guān)文章

最新評(píng)論

裕民县| 贡嘎县| 商洛市| 福贡县| 东城区| 垣曲县| 瑞安市| 灵石县| 广河县| 西充县| 吴川市| 东乌| 玉屏| 于都县| 集安市| 阿鲁科尔沁旗| 石门县| 庆元县| 黑河市| 永川市| 长子县| 皮山县| 手游| 江源县| 英超| 格尔木市| 赣榆县| 南安市| 德惠市| 和硕县| 苍梧县| 辽阳县| 双江| 西充县| 阿拉善左旗| 墨竹工卡县| 鄂伦春自治旗| 灵武市| 武邑县| 渝中区| 翁牛特旗|