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