<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: защита от повторного запуска скрипта]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=11</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: защита от повторного запуска скрипта».]]></description>
		<lastBuildDate>Mon, 23 Nov 2009 21:19:00 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: защита от повторного запуска скрипта]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=30995#p30995</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 23 Nov 2009 21:19:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=30995#p30995</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: защита от повторного запуска скрипта]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=22#p22</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 07 Jul 2006 20:17:53 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=22#p22</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: защита от повторного запуска скрипта]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=21#p21</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 07 Jul 2006 20:12:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=21#p21</guid>
		</item>
	</channel>
</rss>
