<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: защита от повторного запуска скрипта]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11&amp;type=atom" />
	<updated>2009-11-23T21:19:00Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: защита от повторного запуска скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=30995#p30995" />
			<content type="html"><![CDATA[<p>Уточнённый текст WQL-запроса (в предыдущем примере скрипт, открытый в Блокноте, воспринимался как уже запущенный), учитывающий, что исполняющими хостами для WSH могут быть только «wscript.exe» или «cscript.exe» (если Вы используете дополнительные хосты — исправьте WQL-запрос соответствующим образом):<br /></p><div class="codebox"><pre><code>&quot;SELECT Name, CommandLine, ProcessID 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;, &quot;WQL&quot;, 0)</code></pre></div><p>Расширенный пример:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objSWbemServicesEx

Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim currPID


Set objSWbemServicesEx = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot;)

currPID = GetScriptProcessID()

Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
    &quot;SELECT Name, CommandLine, ProcessID 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;, &quot;WQL&quot;, 0)

If collSWbemObjectSet.Count &gt; 1 Then
    WScript.Echo &quot;Скрипт уже запущен (* — текущий процесс):&quot;
    
    For Each objSWbemObjectEx In collSWbemObjectSet
        If currPID = objSWbemObjectEx.ProcessID Then
            WScript.Echo &quot; * PID:&quot; &amp; vbTab &amp; objSWbemObjectEx.ProcessID &amp; vbTab &amp; &quot;Command line: &quot; &amp; objSWbemObjectEx.CommandLine
        Else
            WScript.Echo &quot;   PID:&quot; &amp; vbTab &amp; objSWbemObjectEx.ProcessID &amp; vbTab &amp; &quot;Command line: &quot; &amp; objSWbemObjectEx.CommandLine
        End If
    Next
    
    WScript.Quit 1
End If

WScript.Echo &quot;Единственный экземпляр скрипта:&quot;

For Each objSWbemObjectEx In collSWbemObjectSet
    WScript.Echo &quot; * PID:&quot; &amp; vbTab &amp; objSWbemObjectEx.ProcessID &amp; vbTab &amp; &quot;Command line: &quot; &amp; objSWbemObjectEx.CommandLine
Next

WScript.Echo
WScript.Echo &quot;Здесь операторы Вашего скрипта. В примере же просто ждём 60 секунд.&quot;
WScript.Echo &quot;Вы можете за это время попробовать запустить другой экземпляр этого же скрипта.&quot;

WScript.Sleep 60 * 1000


Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0
&#039;=============================================================================

&#039;=============================================================================
&#039; WSH: как из скрипта определить его идентификатор процесса (PID)
&#039; (http://forum.script-coding.com/viewtopic.php?id=2454)
&#039;
Function GetScriptProcessID()
    With WScript.CreateObject(&quot;WScript.Shell&quot;).Exec(&quot;&quot;&quot;mshta.exe&quot;&quot; &quot;&quot;&lt;HTML&gt;&lt;HEAD&gt;&lt;HTA:APPLICATION APPLICATIONNAME=&#039;GetParentPID&#039; WINDOWSTATE=&#039;minimize&#039; SHOWINTASKBAR=&#039;no&#039;&lt;/HEAD&gt;&lt;/HTML&gt;&quot;&quot;&quot;)
        GetScriptProcessID = objSWbemServicesEx.Get(&quot;Win32_Process.Handle=&#039;&quot; &amp; CStr(.ProcessID) &amp;&quot;&#039;&quot;).ParentProcessID
        .Terminate
    End With
End Function
&#039;=============================================================================</code></pre></div><p><em>Первый запуск скрипта:</em><br /></p><div class="quotebox"><blockquote><div class="codebox"><pre><code>Единственный экземпляр скрипта:
 * PID:    5888    Command line: CScript.exe &quot;C:\Песочница\39\0001.vbs&quot; 

Здесь операторы Вашего скрипта. В примере же просто ждём 60 секунд.
Вы можете за это время попробовать запустить другой экземпляр этого же скрипта.</code></pre></div></blockquote></div><p><em>Второй запуск скрипта (во время работы первого):</em><br /></p><div class="quotebox"><blockquote><div class="codebox"><pre><code>Скрипт уже запущен (* - текущий процесс):
   PID:    4912    Command line: CScript.exe &quot;C:\Песочница\39\0001.vbs&quot; 
 * PID:    4708    Command line: CScript.exe &quot;C:\Песочница\39\0001.vbs&quot;</code></pre></div></blockquote></div>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2009-11-23T21:19:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=30995#p30995</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: защита от повторного запуска скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=22#p22" />
			<content type="html"><![CDATA[<p>Другой способ. Ищем в запущенных процессах имя нашего скрипта в командных строках этих процессов:<br /></p><div class="codebox"><pre><code>On Error Resume Next
Set objService = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2&quot;)
If Err.Number &lt;&gt; 0 Then
    WScript.Echo Err.Number &amp; &quot;: &quot; &amp; Err.Description
    WScript.Quit
End If
QueryText = &quot;SELECT * FROM Win32_Process WHERE CommandLine LIKE &#039;%&quot; &amp; WScript.ScriptName &amp; &quot;%&#039;&quot;
Set colProc = objService.ExecQuery(QueryText)
If colProc.Count &gt; 1 Then
    WScript.Echo &quot;Скрипт уже запущен&quot;
    WScript.Quit
End If
WScript.Sleep 60000 &#039;вместо этой строки следует вставить операторы своей программы</code></pre></div>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2006-07-07T20:17:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=22#p22</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: защита от повторного запуска скрипта]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=21#p21" />
			<content type="html"><![CDATA[<p>Скрипт демонстрирует простейший способ защиты от повторного запуска:<br /></p><div class="codebox"><pre><code>Set FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
If FSO.FileExists(&quot;C:\&quot; &amp; WScript.ScriptName &amp; &quot;.txt&quot;) Then
    MsgBox &quot;Скрипт уже запущен&quot;
    WScript.Quit
End If
FSO.CreateTextFile &quot;C:\&quot; &amp; WScript.ScriptName &amp; &quot;.txt&quot;
WScript.Sleep 60000 &#039;вместо этой строки следует вставить операторы своей программы
FSO.DeleteFile &quot;C:\&quot; &amp; WScript.ScriptName &amp; &quot;.txt&quot;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2006-07-07T20:12:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=21#p21</id>
		</entry>
</feed>
