Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой (http://forum.oszone.net/showthread.php?t=152940)

iDrug 12-10-2009 00:09 1240386

Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
 
Здрасте, вот вопрос такой:
Не знаю какой из скриптовых языков администрирования такое может и главное - как это сделать?
Суть требований такова: запускать сразу 2 процесса одновременно, и проверять, когда первый умрёт (я выгружу программу эту вручную), то надо убить и 2-ой процесс. И главное чтобы при этом не висело чёрное окно cmd или чего-то подобного.

Iska 12-10-2009 03:15 1240485

iDrug, практически любой. Вот пример на VBScript на основе WMI:

читать дальше »
Sample.vbs
Код:

Option Explicit

Dim lngProcessID1, lngProcessID2

With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
        With .Get("Win32_Process")
                .Create "notepad.exe", "c:\\temp", Nothing, lngProcessID1
                .Create "calc.exe", "c:\\windows", Nothing, lngProcessID2
        End With
       
        .ExecNotificationQuery( _
                "SELECT * FROM __InstanceDeletionEvent WITHIN 1 " & _
                "WHERE TargetInstance ISA 'Win32_Process' AND " & _
                "TargetInstance.ProcessID = '" & CStr(lngProcessID1) & "'").NextEvent
       
        On Error Resume Next
        .Get("Win32_Process.Handle='" & CStr(lngProcessID2) & "'").Terminate
        On Error Goto 0
End With

WScript.Quit 0

«On Error Resume Next/On Error Goto 0» нужно на случай, если второй процесс будет закрыт ранее, нежели будет закрыт первый.

Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.

iDrug 12-10-2009 03:55 1240491

Цитата:

Цитата Iska
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения. »

Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Скрипт работает только если исполняемые процессы лежат в папке windows. Иначе почему-то выдаёт сообщение об ошибке, где жалуется на:
11 строку, 2-ой символ
Ошибка: Недопустимое использование Null: 'CStr'
Код: 800А005Е

как сделать так, чтобы он работал и для других путей?

Iska 12-10-2009 06:01 1240500

Цитата:

Цитата iDrug
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел. »

Если у Вас исполняющим ядром Windows Script Host по умолчанию является «wscript.exe» (таким оно является после установки, и у обычных пользователей, как правило, не меняется) — тогда окна консоли не будет:
читать дальше »
Цитата:

Цитата wscript.exe /?
Использование: WScript имя_сценария.расширение [параметры...] [аргументы...]

Параметры:

//E:ядро Использование указанного ядра для выполнения сценария
//H:CScript Стандартный сервер сценариев заменяется на CScript.exe
//H:WScript Стандартный сервер сценариев заменяется на WScript.exe (по умолчанию)


Цитата:

Цитата iDrug
Скрипт работает только если исполняемые процессы лежат в папке windows.»

Не совсем так. Метод «.Create()» класса «Win32_Process», если не указан путь, ищет исполняемые файлы в текущем каталоге, затем в каталогах, перечисленных в переменной окружения PATH:
читать дальше »
Код:

Option Explicit

Dim lngProcessID1, lngProcessID2

With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
        With .Get("Win32_Process")
                .Create "c:\\program files\\far\\far.exe", "c:\\temp", Nothing, lngProcessID1
                .Create "winrar.exe", "c:\\windows", Nothing, lngProcessID2
        End With
       
        .ExecNotificationQuery( _
                "SELECT * FROM __InstanceDeletionEvent WITHIN 1 " & _
                "WHERE TargetInstance ISA 'Win32_Process' AND " & _
                "TargetInstance.ProcessID = '" & CStr(lngProcessID1) & "'").NextEvent
       
        On Error Resume Next
        .Get("Win32_Process.Handle='" & CStr(lngProcessID2) & "'").Terminate
        On Error Goto 0
End With

WScript.Quit 0

В этом примере «Far Manager» запускается с использованием полного пути (ещё раз обратите внимание на использование двух слэшэй в качестве разделителей), а Winrar.exe — без указания, поскольку в PATH присутствует путь к каталогу Winrar'а:
Цитата:

Цитата path
PATH=C:\WINDOWS\SYSTEM32;C:\WINDOWS;C:\WINDOWS\SYSTEM32\WBEM; … C:\PROGRAM FILES\WINRAR; …


iDrug 12-10-2009 14:01 1240867

и всё равно у меня почему-то выдаёт ту же ошибку...
вот как у меня:
Код:

                .Create "C:\\Portable soft\\TotalCommanderPortable\\TotalCommanderPortable.exe", "c:\\temp", Nothing, lngProcessID1
                .Create "C:\\Portable soft\\TotalCommanderPortable\\megascroll.exe", "c:\\temp", Nothing, lngProcessID2

сам *.vbs скрипт при этом находится в той же папке где и 2 программы, которые я хочу запустить.

Iska 12-10-2009 17:28 1241038

iDrug,
а) у Вас существует каталог «c:\temp»?
б) подозреваю, что, возможно, следить надо будет не за «TotalCommanderPortable.exe». Впрочем, сначала ответьте на а).

iDrug 12-10-2009 17:47 1241054

спасибо, указали на ошибку. Я просто в этом ни черта не понимаю и подумал что он проверяет по 1-ому пути и если там нет этого объекта то ищет по второму, потому я во втором пути и указал несуществующий путь, т.к. подумал что он нафиг не нужен.
исправил на любой другой существующий путь - и скрипт заработал, спасибо.

p.s.: хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. Тем не менее ваш скрипт я сохраню - мало ли где в хозяйстве пригодится? :)

Iska 12-10-2009 19:08 1241114

Цитата:

Цитата iDrug
Я просто в этом ни черта не понимаю »

Create Method of the Win32_Process Class (Windows)
Второй параметр метода .Create() задаёт текущий каталог для запускаемого приложения (примерно то же, что и «Рабочая папка» в свойствах ярлыка). Его можно задать, например, равным каталогу, откуда запускается скрипт:
Код:


Dim strScriptPath

strScriptPath = WScript.CreateObject("Scripting.FileSystemObject").GetFile(WScript.ScriptFullName).ParentFolder

With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
        With .Get("Win32_Process")
                .Create "C:\\Portable soft\\TotalCommanderPortable\\TotalCommanderPortable.exe", strScriptPath, Nothing, lngProcessID1
                …

Цитата:

Цитата iDrug
хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. »

Сие будет ещё лучше. Если доступен исходный текст, Вы можете его исправить так, чтобы именно он запускал «TotalCommanderPortable.exe» и следил за ним.


Время: 12:00.

Время: 12:00.
© OSzone.net 2001-