ShaddyR, я очень скоренько наборосал...
Не все проблемы решены.
Код:
Set Args = WScript.Arguments
' *******************************************
CONST FIELDS = 3
CONST PSNAME = 0
CONST PSNUMB = 1
CONST PSMAXN = 2
Dim thePsArray ( )
Dim nToWatch
nToWatch = 0
Function AddPsToWath( name, number )
ReDim Preserve thePsArray ( FIELDS, nToWatch )
thePsArray(PSNAME, nToWatch) = name
thePsArray(PSNUMB, nToWatch) = number
thePsArray(PSMAXN, nToWatch) = number
addPsToWatch = nToWatch
nToWatch = nToWatch + 1
End Function
' *******************************************
Sub ReadPsWatchFile(filename)
Dim fso, f
' On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(filename, 1, False)
if Err.Number<>0 then
call Error_(0)
else
while not f.atEndOfStream
s = f.ReadLine
ms = Split(s, " ", -1, vbBinaryComapre)
s1 = ms(0)
n2 = CInt(ms(1))
n = AddPsToWath(s1, n2)
Err.Clear
wend
f.Close
end if
End Sub
' *******************************************
Sub StartUpWatcher()
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colMonitoredProcesses = objWMIService. _
ExecNotificationQuery("select * from __InstanceCreationEvent" _
& " within 1 where TargetInstance isa 'Win32_Process'")
Set colMonitorProcessesd = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent " & _
"WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' ")
Do While 1
Set objLatestProcess = colMonitoredProcesses.NextEvent
For psn=0 to nToWatch-1
If objLatestProcess.TargetInstance.Name = thePsArray(PSNAME, psn) Then
thePsArray(PSNUMB, psn) = thePsArray(PSNUMB, psn) - 1
' Wscript.Echo "Num: "& thePsArray(PSNUMB, psn)
If thePsArray(PSNUMB, psn) < 0 then
Wscript.Echo "Вы запустили лишнюю копию программы "& objLatestProcess.TargetInstance.Name _
& " - разрешенный лимит только " & thePsArray(PSMAXN, psn)
objLatestProcess.TargetInstance.Terminate
thePsArray(PSNUMB, psn) = thePsArray(PSNUMB, psn) + 1
End If
End If
Next
Loop
End Sub
' *******************************************
for i=0 to Args.count-1
If Args(i) = "-f" Then
iaFilename = Args(i+1)
End If
Next
If iaFilename<>"" Then
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists(iaFilename)) Then
Call ReadPsWatchFile(iaFilename)
If nToWatch=0 Then
Wscript.Echo "File is empty."
Else
Call StartUpWatcher()
End If
Else
Wscript.Echo "File exists not."
End If
Else
Wscript.Echo "watcher.vbs -f filename"
End If
Формат файла такой
Код:
имяпрограммы1.exe n1
имяпрограммы2.exe n2
имяпрограммы3.exe n3
Запускается скрипт
watcher.vbs -f filename
но вот по поводу 2.2) Нет возврата счетчика в обратное состояние, если одна из копий закрывается. - это я не могу сейчас сообразить. как сделать
И вообще не уверен, что это возможно :-|