как проверить, работает ли vbs скрипт в windows или нет? - PullRequest
7 голосов
/ 21 октября 2011

Я создал сценарий VBS в Windows. Я буду запускать этот скрипт, чтобы получить размер файла.

Я сделал это, чтобы бежать вечно. (даже это мое требование).

Откуда мне знать, работает он или остановлен?

------ Exact Script starts here ----- 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set FSO_check=CreateObject("Scripting.FileSystemObject") 
do while infiniteLoop=0     
----- This code is lasting for ever ----
Loop

Я ясно в своем задании?

Ответы [ 4 ]

4 голосов
/ 21 октября 2011

Как насчет использования свойства командной строки? Я думаю, что это нужно Windows XP и выше.

Например:

Set objSWbemServices = GetObject ("WinMgmts:Root\Cimv2") 
Set colProcess = objSWbemServices.ExecQuery _ 
("Select * From Win32_Process where name = 'wscript.exe'") 
For Each objProcess In colProcess 
    WScript.Echo objProcess.Name, _ 
    objProcess.ProcessId, _ 
    objProcess.CommandLine 
Next
1 голос
/ 06 июня 2017

@ nimizen ответ неверный.Если у вас запущен другой wscript, он вернет, что ваш скрипт уже запущен.

@ h pic ответ правильный, но я получаю ошибку с массивом "a" в моих окнахПоэтому я немного изменил его и почистил для работы.

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("select * from win32_process where name = 'wscript.exe'")

i = 0
For Each objProcess in colProcesses
    if not (IsNull(objProcess.CommandLine )) then
            strScriptName = Trim(Right(objProcess.CommandLine,Len(objProcess.CommandLine) - InstrRev(objProcess.CommandLine,"\")))
            strScriptName = Left(strScriptName, Len(strScriptName) - 1)                             
            if strScriptName = Wscript.ScriptName then
                i=i+1
            end if
            if i > 1 then 'if > 1 wscript instance
                    'Wscript.Echo "Duplicate :"&strScriptName&" ."
                    Wscript.Quit
            end if  
    end if  
Next

'Wscript.Echo "Pause 2 have 2 scripts running ."
1 голос
/ 04 июля 2016

Я сделал скрипт, и в начале я хотел избежать запуска нескольких / повторяющихся экземпляров одного и того же процесса.Это мой код для выхода из более нового экземпляра в случае, если он запускается, когда он уже запущен.
Примечание. Это примечание не позволяет запускать несколько файлов wscripts - просто предотвращает одновременный запуск одного и того же конкретного файла.

Чтобы адаптироваться к исходному вопросу ... просто используйте блок, который проверяет текущие запущенные процессы, если любое из имен файлов wscript соответствует файлу сценария, который вы ищете, тогда он работает.

function duplicate_check        

'if two scripts get here at the same time - stagger when the generate _
    'the list of running processes _
    'ie - give 1 of them time to close
    'else they can both quit leaving no more scripts running
call random_script_sleep(2500,500)

dim myfilename
myfilename = Wscript.ScriptName 

strComputer = "." 
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("select * from win32_process")

'fill arrary w/ all running script names
i = 0
For Each objProcess in colProcesses 
    If objProcess.Name = "wscript.exe" Then
        strScriptName = Trim(Right(objProcess.CommandLine,Len(objProcess.CommandLine) - InstrRev(objProcess.CommandLine,"\")))
        strScriptName = Left(strScriptName, Len(strScriptName) - 1)                             
        a(i)= strScriptName         '           
        i=i+1   
    end if          
Next

'kill script if already running w/ same name
if i > 1 then 'if > 1 wscript instance
    for s = 0 to i
        if a(s) = myfilename then
            wscript.quit
        end if
    next
end if

'sometimes duplicate check fails, if so, write to error log
If Err.Number = 1 Then
    error_notes = " @duplicate check, firstdupcheck(0/1):" & firstdupcheck
    call error_log
    error_notes = "error undefined" 
end if

' if debugmsg = 1 then CreateObject("WScript.Shell").Popup _
    ' "found this many scripts: " & i & vbCrlf & _
    ' "<>" & i & vbCrlf & _
    ' ", 1, "debug popup"   

end function  
0 голосов
/ 16 мая 2012

Хм, ну, во-первых, если это скрипт с бесконечным циклом, то вы, вероятно, используете его для периодической проверки папки для выполнения некоторой работы.Это звучит плохо, но обычно менее ресурсоемко, чем подключаться к WMI для уведомлений.Если он работает и работает, он работает.Настоящая проблема заключается в том, чтобы отличать его от всех других сценариев WScript и CScripts, которые у вас могут быть запущены.

MS Sysinternals Process Explorer http://technet.microsoft.com/en-us/sysinternals/bb896653 хорош для того, чтобы сообщать вам информацию о запущенных процессах.В основном, я бы использовал его, чтобы с помощью уникальных аргументов командной строки определить, какой процесс скрипта содержит какой скрипт.

Нет простого способа точно определить идентификатор процесса вашего скрипта из скрипта.Это один из немногих фрагментов информации времени выполнения, который не представлен в объектной модели среды сценария.Поскольку вы уже используете объект файловой системы, возможно, вы могли бы искать фиктивное имя файла для использования в качестве индикатора его работы.Если сценарий не может создать или открыть файл, можно предположить, что другой экземпляр сценария уже запущен.

Или имейте другой уникальный именованный файл-заглушку, который вы можете легко создать, и ваш сценарий автоматически удаляется во время выполнения обработки.Таким образом, вы просто создаете пустой файл с таким именем в качестве теста, и если он не исчезает в течение нескольких секунд, вы знаете, что ни один экземпляр вашего скрипта не запущен.

Также я подумал, что вы можете запустить свойскрипт из другого скрипта, использующий Exec (), который возвращает ProcessID запущенного скрипта, а затем освобождает вашу ссылку на него, сохраняя ProcessID там, где он вам нужен для дальнейшего использования.

Set oExec = WshShell.Exec( "infinite.vbs" )
MyProcessID = oExec.ProcessID ' procID of shell'd program. 
set oExec = Nothing

and do something with MyProcessID

Затем я заметил эту запись

Найти свой собственный идентификатор процесса в VBScript

, который использует Exec () для запуска сценария HTA, получает его ProcessID и ищет его в WMI, а затем использует набор результатовиз WMI, чтобы найти ProcessID Родительского процесса, который должен быть сценарием, выполняющим вызовы Exec () и WMI.Проблема в том, что HTA может прекратить работу до того, как WMI получит возможность его найти.

Dim iMyPID : iMyPID = GetObject("winmgmts:root\cimv2").Get("Win32_Process.Handle='" & CreateObject("WScript.Shell").Exec("mshta.exe").ProcessID & "'").ParentProcessId 

В основном у меня возникает ощущение, что это все излишне по той причине, по которой вы думаете, что вам нужно знать, если сценарийБег.Вместо этого сосредоточьтесь на том, какое действие «зная, работает процесс или нет» заставляет вас предпринять.Так как это не было объяснено, мы действительно не можем предложить вам альтернативную стратегию, чтобы доставить вас туда, но я уверен, что доступно более простое решение.Например, TheFolderSpy http://venussoftcorporation.blogspot.com/2010/05/thefolderspy.html может быть одним из альтернативных способов запуска вашей программы без бесконечного цикла.

Не забудьте использовать в цикле команду sleep, чтобы позволить другим программам выполнить свою работу.Это имеет большое значение в использовании ресурсов.Также вам нужен только один экземпляр FSO, сделайте его глобальным для всего вашего кода, создав его на ранних этапах в вашем скрипте перед любыми подпрограммами.

Поскольку вы смотрите на размер файла, вы, вероятно, проверяете его наизменения.Я обнаружил, что цикл с небольшой задержкой WScript.Sleep 200 полезен для обнаружения изменений в файле.Таким образом, вы можете обработать файл вместо того, чтобы пропустить его до следующего прохода основного цикла, который должен быть установлен на 10 секунд или более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...