Тема: 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) { }