<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: запуск единственной копии сценария]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=1151</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=1151&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: запуск единственной копии сценария».]]></description>
		<lastBuildDate>Wed, 13 Feb 2008 10:30:31 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[CMD/BAT: запуск единственной копии сценария]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=8865#p8865</link>
			<description><![CDATA[<div class="codebox"><pre><code>@echo off

rem Этот блок предотвращает одновременный запуск более 1 CMD-сценария 
if &quot;%STDOUT_REDIRECTED%&quot; == &quot;&quot; (
 SETLOCAL ENABLEDELAYEDEXPANSION
 set STDOUT_REDIRECTED=yes
 call %0 %* 3&gt;%~n0.lck
 exit /b %ERRORLEVEL%
)

echo Единственный экземпляр
pause</code></pre></div><p>Принцип работы честно и благородно уперт из статьи <a href="http://www.rsdn.ru/article/winshell/batanyca.xml">http://www.rsdn.ru/article/winshell/batanyca.xml</a>, только там сей принцип использовался для других целей.<br />Кратко о принципе: при запуске, если не определена переменная окружения <strong>STDOUT_REDIRECTED</strong>, то сценарий вызывает сам себя с перенаправлением вывода в файл. Если файл для записи открыть не удается, то, значит, одна копия сценария уже работает и дубль вылетает с ошибкой, чего и добивались.<br />Пояснение для строчки </p><div class="codebox"><pre><code>call %0 %* 3&gt;%~n0.lck</code></pre></div><p>Тут мы вызываем сами себя (<strong>call %0</strong>), передаем себе все параметры, с которыми нас вызывали (<strong>%*</strong>) и перенаправляем выходной поток под номером 3 в <strong>лок-файл</strong> (<strong>%~n0.lck</strong>), имя которого равно имени сценария, а расширение - <strong>lck</strong>.<br />Поток под номером 3 выбран для того, чтобы не мешать сценарию выводить текст. Поток 1 - STDOUT, 2 - STDERR, а прочие отданы на откуп разработчику. Чем и пользуемся.</p><p>Примечание - в текущей версии каталог, где лежит сценарий, должен быть доступен на запись, иначе потребуется поправить путь к лок-файлу.</p>]]></description>
			<author><![CDATA[null@example.com (delpher)]]></author>
			<pubDate>Wed, 13 Feb 2008 10:30:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=8865#p8865</guid>
		</item>
	</channel>
</rss>
