1

Тема: WSH: слежение за использованием CD/DVD-привода

Как показала жизнь, иногда такая необходимость возникает.
Предлагаю два решения. Первое попроще - из одного скрипта. Недостаток в том, что остановить работу такого скрипта в произвольный момент можно только через Диспетчер задач, завершив процесс wscript.exe. Но если следить надо всё время от включения компьютера до выключения, то сгодится.
Скрипт периодически проверяет привод на готовность и так отслеживает моменты загрузки и выгрузки диска. Время этих событий записывает в лог-файл.

/*****************
 Имя: CdRomSpy.js
*****************/

// VARIABLES

ws=WScript;
sh=ws.CreateObject("WScript.Shell");
fso=ws.CreateObject("Scripting.FileSystemObject");
driveName="P:";  // Буква cd-rom'a.
drive=fso.GetDrive(driveName);
checkTime=3000;  // Время между проверками (в миллисекундах). Не рекомендую
                  // ставить меньше 1000. Смысла никакого.
logFilePath="C:\\cd-rom.log";  // Путь к файлу с логом.


// FUNCTIONS

function waitForLoad()
{
  while(!drive.IsReady) ws.Sleep(checkTime);
  var time=new Date().toLocaleString();
  with (fso.OpenTextFile(logFilePath,8))
    WriteLine("Загрузка диска: "+time), Close();
  waitForUnload();
}

function waitForUnload()
{
  while(drive.IsReady) ws.Sleep(checkTime);
  var time=new Date().toLocaleString();
  with(fso.OpenTextFile(logFilePath,8))
    WriteLine("Выгрузка диска: "+time), WriteBlankLines(1), Close();
  waitForLoad();
}


// MAIN CODE

sh.Popup("Запуск",1);
if(!fso.FileExists(logFilePath)) fso.CreateTextFile(logFilePath);
if(!drive.IsReady) waitForLoad();
else waitForUnload();

Второе решение - пара скриптов. Второй служит для остановки первого. Первый при запуске создаёт в реестре раздел-маркёр и дальше делает свою работу, периодически проверяя существование раздела. Второй скрипт при запуске удаляет этот раздел. Первый, обнаружив это, завершается.
Не советую делать паузу между проверками меньше 1000 миллисекунд. Во-первых, время всё равно пишется с точностью до секунды, а во-вторых, очень часто будет проверяться реестр. Может, оно ему и ничего, но кто его знает. А до раза в секунду, думаю, нормально.
Первый скрипт:

/*****************
 Имя: CdRomSpy.js
*****************/

// VARIABLES

ws=WScript;
sh=ws.CreateObject("WScript.Shell");
fso=ws.CreateObject("Scripting.FileSystemObject");
driveName="P:";  // Буква cd-rom'a.
drive=fso.GetDrive(driveName);
checkTime=3000;  // Время между проверками (в миллисекундах). Не рекомендую
                  // ставить меньше 1000. Смысла никакого.

logFilePath="C:\\cd-rom.log";  // Путь к файлу с логом.
regKey="HKCU\\_marker\\";  // Раздел в реестре, для общения между скриптами.


// FUNCTIONS

function waitForLoad()
{
  while(!drive.IsReady) {
    ws.Sleep(checkTime); if(!keyExists()) ws.Quit() }
  var time=new Date().toLocaleString();
  with (fso.OpenTextFile(logFilePath,8))
    WriteLine("Загрузка диска: "+time), Close();
  waitForUnload();
}

function waitForUnload()
{
  while(drive.IsReady) {
    ws.Sleep(checkTime); if(!keyExists()) ws.Quit() }
  var time=new Date().toLocaleString();
  with(fso.OpenTextFile(logFilePath,8))
    WriteLine("Выгрузка диска: "+time), WriteBlankLines(1), Close();
  waitForLoad();
}

function keyExists()
{
  try { sh.RegRead(regKey); return(1) }
  catch(e) { return(0) }
}


// MAIN CODE

sh.Popup("Запуск",1);
if(!fso.FileExists(logFilePath)) fso.CreateTextFile(logFilePath);
sh.RegWrite(regKey,"");
if(!drive.IsReady) waitForLoad();
else waitForUnload();

Второй скрипт:

/*****************
 Имя: StopSpy.js
*****************/

// VARIABLES

ws=WScript;
sh=ws.CreateObject("WScript.Shell");
regKey="HKCU\\_marker\\";


// MAIN CODE

sh.Popup("Остановка",1);
try { sh.RegRead(regKey); sh.RegDelete(regKey) }
catch(e) { }

2 (изменено: Poltergeyst, 2019-11-05 02:38:28)

Re: WSH: слежение за использованием CD/DVD-привода

----------------------------------------------------------------
---- Без гарантий. Используете на свой страх и риск. -
----------------------------------------------------------------
Скрипт предназначен для слежения за вставкой/извлечением диска в CDROM накопитель и основан на интерфейсе WMI. События вставки/извлечения диска, подтверждаются соответствующими сообщениями, а также записью в файл протокола.
----------------------------------------------------------------
Lang. VBScript
Потребуется установленный LangMF 7.7 и выше
OC WinMe/XP
----------------------------------------------------------------
Для начала работы запустите CDRWatch.vbs. Рекомендуется запускать скрипт при извлеченном CD/DVD диске. Чтобы остановить наблюдение за приводом CDROM выберите соответствующий пункт в меню трей-иконки.
----------------------------------------------------------------

Post's attachments

CDRomWatch.zip 5.29 kb, 3 downloads since 2019-11-05 

You don't have the permssions to download the attachments of this post.

3 (изменено: Poltergeyst, 2019-11-05 02:39:09)

Re: WSH: слежение за использованием CD/DVD-привода

Дальнейшее развитие предыдущей идеи выполнено на VB.NET. Небольшой код VB.NET предназначен для слежения за вставкой/извлечением диска в CDROM накопитель и основан на интерфейсе WMI. События вставки/извлечения диска отслеживаются в синхронном режиме и подтверждаются соответствующими сообщениями выводимыми в консоль, а также записью в файл протокола. Чтобы остановить наблюдение за CDROM активируйте консольное окно приложения и нажмите Ctrl+C. Рекомендуется запускать при извлеченном CD/DVD диске.
---------------------------------------
Lang. VB.NET
NET Framework v2.0.50727
OC WinMe/XP
---------------------------------------
Чтобы получить исполняемый модуль (консольное приложение) откомпиллируйте файл CDPolling.vb примерно следующей командой:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\vbc.exe C:\...\CDPolling.vb /out:C:\...\CDPolling.exe /target:exe
---------------------------------------

Post's attachments

CDnetwth.zip 7.47 kb, 3 downloads since 2019-11-05 

You don't have the permssions to download the attachments of this post.