<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSH: управление запущенным скриптом.]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=1945</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1945&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSH: управление запущенным скриптом.».]]></description>
		<lastBuildDate>Wed, 16 Jul 2008 02:54:10 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[WSH: управление запущенным скриптом.]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=12579#p12579</link>
			<description><![CDATA[<p><strong>Управление работой запущенного скрипта.</strong></p><div class="codebox"><pre><code>Option Explicit

Dim strAction
Dim boolTerminateRequest
Dim intIntervalRequest

Dim strComputer

Dim objSWbemServices
Dim objSWbemSink_Win32_Process
Dim strPartWQL4ThisScript

Dim objNamedArgs

Set objNamedArgs = WScript.Arguments.Named

If objNamedArgs.Exists(&quot;Start&quot;) Then
    strAction = &quot;Start&quot;
Else
    If objNamedArgs.Exists(&quot;Stop&quot;) Then
        strAction = &quot;Stop&quot;
    Else
        WScript.Echo _
            &quot;Использование:&quot; &amp; vbCrLf &amp; _
            &quot;&quot; &amp; vbCrLf &amp; _
            WScript.ScriptName &amp; &quot; &lt;/Start | /Stop&gt;&quot; &amp; vbCrLf &amp; _
            &quot;&quot; &amp; vbCrLf &amp; _
            &quot;/Start : Запуск скрипта на исполнение.&quot; &amp; vbCrLf &amp; _
            &quot;/Stop  : Останов запущенного скрипта.&quot;
        Set objNamedArgs = Nothing
        
        WScript.Quit 254
    End If
End If

strComputer = &quot;.&quot;
strPartWQL4ThisScript = _
    &quot;SELECT Name, CommandLine 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

intIntervalRequest = 1
Set objSWbemServices = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)

Select Case strAction
    Case &quot;Start&quot;
        WScript.Sleep 500
        
        If objSWbemServices.ExecQuery(strPartWQL4ThisScript &amp; &quot;% /start%&#039;&quot;).Count = 1 Then
            &#039; Здесь основная часть скрипта для исполнения
            &#039;--------------------------------------------------------------------------
            WScript.Echo &quot;Запускаем скрипт...&quot;
            
            boolTerminateRequest = False
            
            Set objSWbemSink_Win32_Process = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;, &quot;SWbemSink_Win32_Process_&quot;)
            
            objSWbemServices.ExecNotificationQueryAsync objSWbemSink_Win32_Process, _
                &quot;SELECT * FROM __InstanceCreationEvent WITHIN &quot; &amp; CStr(intIntervalRequest) &amp; &quot; WHERE &quot; &amp; _
                &quot;TargetInstance ISA &#039;Win32_Process&#039; AND &quot; &amp; _
                &quot;TargetInstance.Name LIKE &#039;[cw]script.exe&#039; AND &quot; &amp; _
                &quot;TargetInstance.CommandLine LIKE &#039;%[cw]script%&quot; &amp; WScript.ScriptName &amp; &quot;% /stop%&#039;&quot;
                
            Do
                &#039; Делаем какую-либо периодическую работу.
                &#039; Например, такую высокоинтеллектуальную, как вывод текущего времени
                &#039; плюс пауза для имитации многотрудной деятельности скрипта, :)
                WScript.Echo Time
                WScript.Sleep 10 * 1000
            Loop Until boolTerminateRequest
            
            WScript.Echo &quot;Завершение работы скрипта...&quot;
            
            objSWbemSink_Win32_Process.Cancel
            Set objSWbemSink_Win32_Process = Nothing
            Set objSWbemServices = Nothing
            &#039;--------------------------------------------------------------------------
        Else
            Set objSWbemServices = Nothing
            QuitInfo &quot;Скрипт уже запущен.&quot;, 1, 5
        End If
    Case &quot;Stop&quot;
        If objSWbemServices.ExecQuery(strPartWQL4ThisScript &amp; &quot;% /start%&#039;&quot;).Count = 1 Then
            &#039; Здесь основная часть скрипта для завершения
            &#039;--------------------------------------------------------------------------
            WScript.Echo &quot;Найден запущенный экземпляр скрипта.&quot;
            WScript.Echo &quot;Делаем паузу в &quot; &amp; CStr(intIntervalRequest * 2) &amp; &quot; секунд, чтобы он успел перехватить событие.&quot;
            
            WScript.Sleep intIntervalRequest * 1000 * 2
            &#039;--------------------------------------------------------------------------
        Else
            Set objSWbemServices = Nothing
            QuitInfo &quot;Не найдено запущенных экземпляров скрипта.&quot;, 1, 0
        End If
End Select

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

&#039;==========================================================================
Sub SWbemSink_Win32_Process_OnObjectReady(objLatestEvent, objSWbemAsyncContext)
    If InStr(LCase(objLatestEvent.TargetInstance.CommandLine), &quot;/stop&quot;) &lt;&gt; 0 Then
        WScript.Echo &quot;Получено событие на останов скрипта.&quot;
        WScript.Echo &quot;Исполнение скрипта будет завершено в конце текущего прохода цикла.&quot;
        
        boolTerminateRequest = True
    End If
End Sub
&#039;==========================================================================</code></pre></div><p>Сохраните скрипт на жёсткий диск. Запустите два командных процессора cmd.exe. В одном окне запустите скрипт на исполнение:<br /></p><div class="codebox"><pre><code>cscript.exe //nologo &lt;путь\имя скрипта.vbs&gt; /Start</code></pre></div><p>В другом окне запустите его же для остановки первого экземпляра запущенного скрипта:<br /></p><div class="codebox"><pre><code>cscript.exe //nologo &lt;путь\имя скрипта.vbs&gt; /Stop</code></pre></div><p>Способ основан на появившемся в WMI, начиная с Windows XP (и выше), свойстве <strong>CommandLine</strong> класса <strong>Win32_Process</strong>. При запуске скрипт подписывается на отслеживание событий создания процессов с именем cscript.exe/wscript.exe, содержащих в командной строке текст «cscript»/«wscript», имя файла скрипта, ключ «/Stop».</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 16 Jul 2008 02:54:10 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=12579#p12579</guid>
		</item>
	</channel>
</rss>
