как проверить скрипт 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