Тема: JScript: Идентификатор процесса (процессов), открывшего файл
Добрый день, Уважаемые гуру!
Буду рад если Вы подскажете идею решения следующей задачи:
Дано: Полное имя файла.
Надо: Определить список процессов открывших данный файл.
Подробнее: Необходимо запустить программу ассоциированную с данным файлом.
Сделать это достаточно просто:
oWshShell.Run('"' + sFileFullName + '"', 1)
Однако если с файлом ассоциировано "не хитрое" приложение (не такое как Word или Excel, а например Notepad), то будет открыто ровно столько приложений, сколько запусков файла вы осуществили. А вот именно этого и хотелось бы избежать. А именно: посмотреть если файл уже используется каким либо процессом, то получить Id процесса и активизировать его вызовом
oWshShell.AppActivate( nProcessId );
Косвенное решение данной проблемы я имею. Суть идеи состоит в том, чтобы анализировать командную строку запуска процесса, с выявлением - передан ли файл в качестве аргумента командной строки. Если имя файла есть в аргументах командной строки, то можно с большой уверенностью сказать, что данный файл используется процессом приложения. Однако уверенность не 100 процентная. Ниже код скрипта для описанного анализа:
//
// Поиск процесса
//
function Lib_SysDoc_FindSysDocProcessId( sFileFullName )
{
var oWMIService, oProcItems, oEnumItems, nProcessId;
nProcessId = 0;
try
{
oWMIService = GetObject("winmgmts:\\\\.\\root\\CIMV2");
oProcItems = oWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE name LIKE '%.exe%' OR name LIKE '%.com%'", 'WQL');
// Ишем ProcessId
oEnumItems = new Enumerator(oProcItems);
for (; !oEnumItems.atEnd(); oEnumItems.moveNext())
{
with ( oEnumItems.item() )
{
if ( CommandLine == null )
continue;
if ( CommandLine.indexOf( sFileFullName ) >= 0 )
{
nProcessId = ProcessId;
break;
}
}
}
}
catch(e)
{
nProcessId = 0
}
if ( oWMIService != null )
ReleaseObject(oWMIService);
return( nProcessId )
}
Повторюсь - Буду признателен если Вы подскажете идею решения изложенной выше задачи.