<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS : Предотвращение повторного выполнения скрипта]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10124&amp;type=atom" />
	<updated>2014-11-12T11:52:40Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10124</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88224#p88224" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p><strong>Slav</strong>, могу ошибаться, но кажется в <strong>Win 2K</strong> нет атрибута <strong>commandLine</strong>.</p></blockquote></div><p>Xameleon,</p><p>его там точно нет - я сам это проходил.<br />Приведенный мной скрипт работает начиная с Win XP.</p>]]></content>
			<author>
				<name><![CDATA[Slav]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=16491</uri>
			</author>
			<updated>2014-11-12T11:52:40Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88224#p88224</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88223#p88223" />
			<content type="html"><![CDATA[<p><strong>Slav</strong>, могу ошибаться, но кажется в <strong>Win 2K</strong> нет атрибута <strong>commandLine</strong>. Помню, что сталкивался с этим когда-то давно. Из-за этого запрос поиска процесса падал. Хотя даже если так, то <strong>Win 2K </strong>уже не актуально наверное.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2014-11-12T11:41:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88223#p88223</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88222#p88222" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>MikeSh пишет:</cite><blockquote><p>...<br />Задача : Не допустить повторное выполнение скрипта, если он уже запущен и работает.<br />...</p></blockquote></div><p>MikeSh,</p><p>я расширил эту задачу: <br />- если скрипт НЕ запущен - запустить<br />- если скрипт УЖЕ запущен - то дать выбор пользователю: прекратить его выполнение или продолжить.<br /></p><div class="codebox"><pre><code>
  Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)

&#039; предохранение от повторного запуска
  Set objService = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2&quot;)
      QueryText = &quot;SELECT Name, CommandLine, ProcessID, CreationDate FROM Win32_Process WHERE &quot; &amp; _
                  &quot;Name LIKE &#039;%[cw]script.exe&#039; AND &quot; &amp; _
                  &quot;CommandLine LIKE &#039;%[cw]script%&quot; &amp; WScript.ScriptName &amp; &quot;%&#039;&quot;
      Set colProc = objService.ExecQuery(QueryText, &quot;WQL&quot;, 0)
      If (colProc.Count &gt; 1) Then
         iRet = WshShell.Popup(&quot;ФотоАгент уже запущен. Закончить работу?&quot;, 10, &quot;ФотоАгент&quot;, 4 + vbInformation)  &#039;  4 - Yes - No
         if (iRet = -1) or (iRet = 7) then  &#039;  timeout OR No
            iRet = WshShell.Popup(&quot;ФотоАгент продолжает работать.&quot;, 2, &quot;ФотоАгент&quot;, vbInformation)
            Set objServices = Nothing
            Set WshShell = Nothing
            Set objShell = Nothing
            WScript.Quit 2
         end if
         if (iRet = 6) then  &#039;  Yes
                ii = 0
            For Each currProc in colProc
                if (ii = 0) then
                    maxCreationDate = currProc.CreationDate
                else
                    if (currProc.CreationDate &gt; maxCreationDate) then maxCreationDate = currProc.CreationDate
                end if
                ii = ii + 1
            Next
            
            For Each currProc in colProc
                if (currProc.CreationDate &lt;&gt; maxCreationDate) then currProc.Terminate()
            Next
            iRet = WshShell.Popup(&quot;ФотоАгент закончил работу.&quot;, 2, &quot;ФотоАгент&quot;, vbInformation)
            Set objServices = Nothing
            Set WshShell = Nothing
            Set objShell = Nothing
            WScript.Quit 3
         end if
      End If

  Set objServices = Nothing

  iRet = WshShell.Popup(&quot;ФотоАгент стартовал&quot;, 2, &quot;ФотоАгент&quot;, vbInformation)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Slav]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=16491</uri>
			</author>
			<updated>2014-11-12T11:31:15Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88222#p88222</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88087#p88087" />
			<content type="html"><![CDATA[<p>Не уверен, что это хорошее решение, но как вариант.</p><div class="codebox"><pre><code>
Option Explicit
Dim oScriptFileLocker
Set oScriptFileLocker = new cScriptFileLocker

&#039;Проверяем состояние блокировки
if Not oScriptFileLocker.Locked Then 
    &#039;Блокируем файл скрипта
    oScriptFileLocker.Lock
    MsgBox &quot;Скрипт запущен !&quot;, vbInformation
Else
    &#039;В ином случае сообщаем о том, что скрипт уже выполняется
    MsgBox &quot;Скрипт уже выполняется !&quot;, vbExclamation
End if

Class cScriptFileLocker
    Private oFso, oTs
    Private Sub Class_Initialize()
        Set oFso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    End Sub
    &#039;Блокировка файла
    Public Sub Lock()
        if Not isObject(oTs) Then Set oTs = oFso.OpenTextFile(WScript.ScriptFullName,1,False)
    End Sub
    &#039;Разблокировка файла
    Sub Unlock()
        Set oTs = Nothing
    End Sub
    &#039;Получение состояния блокировки
    Public Property Get Locked()
        On Error Resume Next
        oFso.MoveFile WScript.ScriptFullName, WScript.ScriptFullName
        &#039;Если при попытке переместить файл произошла ошибка 70, значит файл уже открыт на чтение
        If Err.number = 70 Then 
            Locked = True
        Else
            Locked = False
        End if
    End Property
End Class
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2014-11-07T16:14:27Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88087#p88087</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88085#p88085" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>MikeSh пишет:</cite><blockquote><p>В конце концов, вы за меня или за волка? smile</p></blockquote></div><p>Я за Истину <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />!</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2014-11-07T15:35:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88085#p88085</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88084#p88084" />
			<content type="html"><![CDATA[<p>Если было решение, то и отлично.<br />А по поводу командной строки, там используется like, соответственно, если использовать </p><div class="codebox"><pre><code>WScript.ScriptName</code></pre></div><p>, то можно отфильтровать и по имени.<br />Да, возможны ситуации, когда одинаковые имена скриптов, лежат в разных папках и т.д. В конце концов, вы за меня или за волка? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />В любом случае, свою миссию считаю выполненой )</p>]]></content>
			<author>
				<name><![CDATA[MikeSh]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24507</uri>
			</author>
			<updated>2014-11-07T15:28:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88084#p88084</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88083#p88083" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>MikeSh пишет:</cite><blockquote><p>Точно помню, что эта (или очень похожая) тема уже поднималась, но не помню чем закончилась, и возможно даже в ней не было представлено решение.</p></blockquote></div><p>Подымалась, не раз, было предложено несколько решений.</p><div class="quotebox"><cite>MikeSh пишет:</cite><blockquote><p>Решение :</p></blockquote></div><p>К сожалению, не годится, поскольку основано на предположении, что командная строка всегда будет содержать уникальный для скрипта путь. Это не так. Путь <em>может быть</em> абсолютным, может и не быть. Примеры:<br /></p><div class="codebox"><pre><code>&quot;C:\WINDOWS\System32\CScript.exe&quot; &quot;E:\Песочница\0405\0001.vbs&quot;
&quot;C:\WINDOWS\system32\cscript.exe&quot; 0001.vbs
&quot;C:\WINDOWS\system32\cscript.exe&quot; 0405\0001.vbs</code></pre></div>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2014-11-07T14:58:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88083#p88083</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS : Предотвращение повторного выполнения скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=88080#p88080" />
			<content type="html"><![CDATA[<p>Добрый день.<br />Точно помню, что эта (или очень похожая) тема уже поднималась, но не помню чем закончилась, и возможно даже в ней не было представлено решение.<br />Я пытался найти её на форуме, но не нашёл, поэтому пишу, вдруг кому пригодится.</p><p>Задача : Не допустить повторное выполнение скрипта, если он уже запущен и работает.<br />Решение :<br /></p><div class="codebox"><pre><code>
Set PsWMI=GetObject(&quot;winmgmts:&quot;)
Set PsProcesses=PsWMI.ExecQuery(&quot;Select * From Win32_Process Where CommandLine Like &#039;%&quot; &amp; Replace(WScript.ScriptFullName, &quot;\&quot;, &quot;\\&quot;) &amp; &quot;%&#039;&quot;)

i = 0

For Each PsProcess in PsProcesses

  i = i + 1

Next

If i &lt;&gt; 1 Then
  WScript.Quit
End If
</code></pre></div><p>P.s.<br />Возможно данный метод также пригодится тем, кто хочет получить PID процесса запущенного скрипта.</p>]]></content>
			<author>
				<name><![CDATA[MikeSh]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24507</uri>
			</author>
			<updated>2014-11-07T12:26:45Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=88080#p88080</id>
		</entry>
</feed>
