最常用也最可靠的方法是用临时锁文件机制。脚本启动时检查锁文件是否存在,存在则退出,否则创建并执行主逻辑,结束后删除锁文件;需注意命名唯一性、异常残留处理及多用户环境适配。
最常用也最可靠的方法是用临时锁文件机制。脚本启动时先检查是否存在特定锁文件,若存在就直接退出;不存在则创建它,执行完再删掉。
用锁文件判断并阻止重复运行
这是轻量、稳定、不依赖第三方工具的方案。核心逻辑简单清晰:
- 定义一个唯一路径的锁文件,比如 %temp%\my_script.lock
- 脚本开头用 if exist 检查该文件是否存在
- 存在 → 输出提示(可选),然后 exit /b 退出
- 不存在 → 用 echo. > 文件名 创建锁文件,继续执行主逻辑
- 结尾处用 del /f /q "文件名" 2>nul 清理锁文件
注意事项和增强点
锁文件方式看似简单,但几个细节影响实际效果:
- 锁文件名建议包含脚本名或 PID,避免多个不同脚本共用同一锁名导致误判
- 如果脚本异常崩溃(如被强制关闭),锁文件可能残留,下次运行会被拦住。可加时间戳或进程校验提升健壮性
- 想完全静默不弹窗?去掉 echo 和 pause,用 @echo off 开头,并把 exit 改为 exit /b 0
- 多用户环境需注意 %temp% 是当前用户专属,不同用户互不影响
替代方案:用 tasklist 检查进程名(适用场景有限)
如果脚本启动后会持续运行某个子进程(如启动了一个 python.exe 或 notepad.exe),也可用进程名判断:
- 执行 tasklist /fi "imagename eq python.exe" 2>nul | findstr /i "python.exe"
- 有匹配结果说明进程已在运行,可配合 || 或 if errorlevel 1 控制流程
- 缺点明显:无法准确识别“是自己启动的还是别人启动的”,且脚本本身是 cmd 进程,名字都是 cmd.exe,容易误判
锁文件法在绝大多数日常和运维场景中足够好用,不复杂但容易忽略清理步骤。只要确保创建和删除成对出现,就能稳定防重跑。











