Тема: CMD/BAT: запуск единственной копии сценария
@echo off
rem Этот блок предотвращает одновременный запуск более 1 CMD-сценария
if "%STDOUT_REDIRECTED%" == "" (
SETLOCAL ENABLEDELAYEDEXPANSION
set STDOUT_REDIRECTED=yes
call %0 %* 3>%~n0.lck
exit /b %ERRORLEVEL%
)
echo Единственный экземпляр
pause
Принцип работы честно и благородно уперт из статьи http://www.rsdn.ru/article/winshell/batanyca.xml, только там сей принцип использовался для других целей.
Кратко о принципе: при запуске, если не определена переменная окружения STDOUT_REDIRECTED, то сценарий вызывает сам себя с перенаправлением вывода в файл. Если файл для записи открыть не удается, то, значит, одна копия сценария уже работает и дубль вылетает с ошибкой, чего и добивались.
Пояснение для строчки
call %0 %* 3>%~n0.lck
Тут мы вызываем сами себя (call %0), передаем себе все параметры, с которыми нас вызывали (%*) и перенаправляем выходной поток под номером 3 в лок-файл (%~n0.lck), имя которого равно имени сценария, а расширение - lck.
Поток под номером 3 выбран для того, чтобы не мешать сценарию выводить текст. Поток 1 - STDOUT, 2 - STDERR, а прочие отданы на откуп разработчику. Чем и пользуемся.
Примечание - в текущей версии каталог, где лежит сценарий, должен быть доступен на запись, иначе потребуется поправить путь к лок-файлу.