как проверить скрипт vbs в windows работает или нет?

Я создал сценарий 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 ответов


Как насчет использования свойства commandline? Я думаю, что это нужно 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

@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 ."

Хм, Ну, во-первых, если его сценарий бесконечного цикла, то вы, вероятно, используете его для периодической проверки папки для выполнения некоторой работы. Это звучит плохо, но обычно менее ресурсоемко, чем подключение к 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 например, был бы один альтернативный способ запустить вашу программу без бесконечного цикла.

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

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


Я сделал сценарий, и в начале я хотел избежать нескольких / дубликатов экземпляров одного и того же процесса. Это мой код для выхода из нового экземпляра, если он запускается при запуске.
Примечание: это примечание предотвращает запуск нескольких файлов 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