<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Ожидание события с отсчетом времени]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6744</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6744&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Ожидание события с отсчетом времени».]]></description>
		<lastBuildDate>Sun, 29 Jan 2012 11:43:35 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBS: Ожидание события с отсчетом времени]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=56098#p56098</link>
			<description><![CDATA[<p>Здравствуйте, уважаемые коллеги.<br />Хочу поделиться реализацией ожидания события используя синхронный и асинхронный режим подписки на события. <br />Решал с целью запуска процесса на удаленной машине и последующего ожидания завершения его выполнения.<br />Если с ожиданием события &quot;до упора&quot; все более-менее просто:<br /></p><div class="codebox"><pre><code>
Const Process = &quot;notepad.exe&quot;

Set objWMI = GetObject(&quot;winmgmts:\\.\Root\CIMV2&quot;)

ret = objWMI.Get(&quot;Win32_Process&quot;).Create(Process, , , intProcessID)
If ret &lt;&gt; 0 Then
	MsgBox &quot;Не удалось создать процесс &quot; &amp; Process
	WScript.Quit
End If
	
Call ProcessFinished(intProcessID)

MsgBox &quot;Процесс &quot; &amp; Process &amp; &quot; завершен&quot;

&#039;функция ожидания завершения процесса &quot;до упора&quot;
Function ProcessFinished(intProcessID)
	Dim colProcesses, objProcess	
	Set colProcesses = objWMI.ExecNotificationQuery( _
			&quot;SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA &#039;Win32_Process&#039;&quot; &amp; _
			&quot; AND TargetInstance.ProcessID = &#039;&quot; &amp; intProcessID &amp; &quot;&#039;&quot;) 	
	Do
		Set objProcess = colProcesses.NextEvent		
			ProcessFinished = True
			Exit Function		
	Loop	
End Function</code></pre></div><p>То с ожиданием, например, в течение определенного количества времени (я бы предпочел именно этот вариант), на мой взгляд, поинтереснее:<br /></p><div class="codebox"><pre><code>
Const Process = &quot;notepad.exe&quot;

Set objWMI = GetObject(&quot;winmgmts:\\.\Root\CIMV2&quot;)

ret = objWMI.Get(&quot;Win32_Process&quot;).Create(Process, , , intProcessID)
If ret &lt;&gt; 0 Then
	MsgBox &quot;Не удалось создать процесс &quot; &amp; Process
	WScript.Quit
End If

Dim objSink, bFinish

If ProcessFinishedA(intProcessID, 5) Then
	MsgBox &quot;Процесс &quot; &amp; Process &amp; &quot; завершен&quot;
Else
	MsgBox &quot;Процесс &quot; &amp; Process &amp; &quot; не завершен&quot;
End If

&#039;функция ожидания завершения процесса в течение определенного количеста секунд
Function ProcessFinishedA(intProcessID, intSec)
	Set objSink = WScript.CreateObject(&quot;WbemScripting.SWbemSink&quot;,&quot;SINK_&quot;)
	objWMI.ExecNotificationQueryAsync objSink, _
			&quot;SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA &#039;Win32_Process&#039;&quot; &amp; _
			&quot; AND TargetInstance.ProcessID = &#039;&quot; &amp; intProcessID &amp; &quot;&#039;&quot;	
	Do 
		If bFinish Then
			ProcessFinishedA = True
			Exit Function
		End If		
		If i = intSec Then Exit Function		
		i = i + 1		
		WScript.Sleep(1000)		
	Loop
End Function

Sub SINK_OnObjectReady(objObject, objAsyncContext)    
	bFinish = True
End Sub</code></pre></div><p>Возможно кому-нибудь пригодится.</p>]]></description>
			<author><![CDATA[null@example.com (dab00)]]></author>
			<pubDate>Sun, 29 Jan 2012 11:43:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=56098#p56098</guid>
		</item>
	</channel>
</rss>
