1

Тема: 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, а прочие отданы на откуп разработчику. Чем и пользуемся.

Примечание - в текущей версии каталог, где лежит сценарий, должен быть доступен на запись, иначе потребуется поправить путь к лок-файлу.