Здрасте, вот вопрос такой:
Не знаю какой из скриптовых языков администрирования такое может и главное - как это сделать?
Суть требований такова: запускать сразу 2 процесса одновременно, и проверять, когда первый умрёт (я выгружу программу эту вручную), то надо убить и 2-ой процесс. И главное чтобы при этом не висело чёрное окно cmd или чего-то подобного.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
-
Iska
Re: Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
iDrug, практически любой. Вот пример на VBScript на основе WMI:
Sample.vbs
Код:
«On Error Resume Next/On Error Goto 0» нужно на случай, если второй процесс будет закрыт ранее, нежели будет закрыт первый.
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.
читать дальше »
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
Re: Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Цитата Iska:
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Скрипт работает только если исполняемые процессы лежат в папке windows. Иначе почему-то выдаёт сообщение об ошибке, где жалуется на:
11 строку, 2-ой символ
Ошибка: Недопустимое использование Null: 'CStr'
Код: 800А005Е
как сделать так, чтобы он работал и для других путей?
Насчёт чёрных окон cmd.exe относительно самих запускаемых процессов: сие уже зависит от типа процесса, консольный он или GUI. Впрочем, окно процесса что того, что другого типа можно сделать скрытым при начале исполнения.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Скрипт работает только если исполняемые процессы лежат в папке windows. Иначе почему-то выдаёт сообщение об ошибке, где жалуется на:
11 строку, 2-ой символ
Ошибка: Недопустимое использование Null: 'CStr'
Код: 800А005Е
как сделать так, чтобы он работал и для других путей?
-
Iska
Re: Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Цитата iDrug:
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Если у Вас исполняющим ядром Windows Script Host по умолчанию является «wscript.exe» (таким оно является после установки, и у обычных пользователей, как правило, не меняется) — тогда окна консоли не будет:
Цитата wscript.exe /?:
Использование: WScript имя_сценария.расширение [параметры...] [аргументы...]
Параметры:
…
//E:ядро Использование указанного ядра для выполнения сценария
//H:CScript Стандартный сервер сценариев заменяется на CScript.exe
//H:WScript Стандартный сервер сценариев заменяется на WScript.exe (по умолчанию)
…
Цитата iDrug:
Скрипт работает только если исполняемые процессы лежат в папке windows.
Не совсем так. Метод «.Create()» класса «Win32_Process», если не указан путь, ищет исполняемые файлы в текущем каталоге, затем в каталогах, перечисленных в переменной окружения PATH:
Код:
В этом примере «Far Manager» запускается с использованием полного пути (ещё раз обратите внимание на использование двух слэшэй в качестве разделителей), а Winrar.exe — без указания, поскольку в PATH присутствует путь к каталогу Winrar'а:
Цитата path:
PATH=C:\WINDOWS\SYSTEM32;C:\WINDOWS;C:\WINDOWS\SYSTEM32\WBEM; … C:\PROGRAM FILES\WINRAR; …
Я имел ввиду чтобы самого окна скрипта - не было. Проверил ваш скрипт - и там его нет, чего я и хотел.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Если у Вас исполняющим ядром Windows Script Host по умолчанию является «wscript.exe» (таким оно является после установки, и у обычных пользователей, как правило, не меняется) — тогда окна консоли не будет:
читать дальше »
Цитата wscript.exe /?:
Использование: WScript имя_сценария.расширение [параметры...] [аргументы...]
Параметры:
…
//E:ядро Использование указанного ядра для выполнения сценария
//H:CScript Стандартный сервер сценариев заменяется на CScript.exe
//H:WScript Стандартный сервер сценариев заменяется на WScript.exe (по умолчанию)
…
Цитата iDrug:
Скрипт работает только если исполняемые процессы лежат в папке windows.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Не совсем так. Метод «.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
Re: Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
и всё равно у меня почему-то выдаёт ту же ошибку...
вот как у меня:
Код:
сам *.vbs скрипт при этом находится в той же папке где и 2 программы, которые я хочу запустить.
вот как у меня:
Код:
Код: Выделить всё
.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
Re: Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
iDrug,
а) у Вас существует каталог «c:\temp»?
б) подозреваю, что, возможно, следить надо будет не за «TotalCommanderPortable.exe». Впрочем, сначала ответьте на а).
а) у Вас существует каталог «c:\temp»?
б) подозреваю, что, возможно, следить надо будет не за «TotalCommanderPortable.exe». Впрочем, сначала ответьте на а).
-
iDrug
Re: Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
спасибо, указали на ошибку. Я просто в этом ни черта не понимаю и подумал что он проверяет по 1-ому пути и если там нет этого объекта то ищет по второму, потому я во втором пути и указал несуществующий путь, т.к. подумал что он нафиг не нужен.
исправил на любой другой существующий путь - и скрипт заработал, спасибо.
p.s.: хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. Тем не менее ваш скрипт я сохраню - мало ли где в хозяйстве пригодится?
исправил на любой другой существующий путь - и скрипт заработал, спасибо.
p.s.: хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами. Тем не менее ваш скрипт я сохраню - мало ли где в хозяйстве пригодится?

-
Iska
Re: Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Цитата iDrug:
Я просто в этом ни черта не понимаю
Второй параметр метода .Create() задаёт текущий каталог для запускаемого приложения (примерно то же, что и «Рабочая папка» в свойствах ярлыка). Его можно задать, например, равным каталогу, откуда запускается скрипт:
Код:
Цитата iDrug:
хотя, как выяснилось, 2-ой запускаемый процесс (на самом деле это AutoHotkey скрипт) позволяет сделать то же самое только своими собственными силами.
Сие будет ещё лучше. Если доступен исходный текст, Вы можете его исправить так, чтобы именно он запускал «TotalCommanderPortable.exe» и следил за ним.
Я просто в этом ни черта не понимаю
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
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 скрипт) позволяет сделать то же самое только своими собственными силами.
Любой язык - [решено] Скрипт который бы запускал 2 процесса и в случае убийства одного убивал бы и другой
Сие будет ещё лучше. Если доступен исходный текст, Вы можете его исправить так, чтобы именно он запускал «TotalCommanderPortable.exe» и следил за ним.