Обновление: То, что написано ниже, можно скорее рассматривать как некое пособие поWSH, чем решение проблемы. Дело в том, что сама моя проблема была специфична. Из-за какого-то глюка флешке никак не назначалась никакая буква, кроме присвоенной по-умолчанию системой. Не зная этого, я начал городить огород. Но зато попрактиковался в написании скриптов WSH. Дело было так:
Наконец-то я нашел способ сделать то, что обещали некоторые программы, так и не удовлетворив моим потребностям. А нужно было всего немного – запускать определенные программы с флешки, не зависимо от того, какая буква присвоена диску флеш-памяти в данный момент. Дело в том, что мне довольно часто приходится использовать дополнительные диски. И тогда получается следующее. Ярлык на рабочем столе настроен запускать приложение с флешки по пути «G:\WebServers\etc\run.exe». Но вставив в систему еще один диск, я обнаруживаю, что ярлык нерабочий. Диском «G», теперь стал, недавно установленный, IDE-диск. А флешка вдруг стала диском «H», и ярлык естественно, отказался работать.
Вся эта галиматья продолжалась довольно долго. Пока я не вспомнил о старом добром WSH – Windows Scripting Host. Честно говоря, эта идея была у меня давно, но тогда, невнимательно порывшись в документации, я не нашел очень нужного объекта Drives и забросил надолго это дело. Но вот, наткнулся на электронную копию довольно старой (по меркам развития информационных технологий) книги «Введение в Windows Scripting Host(WSH)» Андрея Попова. В этой, очень неплохой книге я и нашел способ получения информации о дисках, которой мне так не хватало. Несколько строчек кода – и проблема решена навсегда.
Итак, у каждого диска есть серийный номер. Наша задача состоит в поиске среди всех имеющихся дисков нужного с искомым серийным номером. Если такой диск находим, то запускаем требуемое приложение.
Теперь встал вопрос, как узнать серийный номер флешки. Наверняка есть и другой способ, но мы воспользуемся средствами WSH. Создадим файл, например info_serial.js. Расширение .js говорит о том, что сценарий в этом файле написан на языке JScript.
Сам скрипт занимает всего три строчки.
fso = WScript.Createobject(«Scripting.FileSystemObject»); // Объявление объекта для работы с файловой системой
d = fso.GetDrive(«g:»); // Свойство GetDrive возвращает объект для работы с диском, в нашем случае, с диском «g» (здесь указать нужную букву диска)
WScript.Echo(«Серийный номер.»,d.SerialNumber); // с помощью свойства SerialNumber объекта Drive получаем серийный номер диска и отображаем его в окне.
Тут все очень просто, наверное, даже комментарии излишни. Замечу лишь, что букву диска флешки придется посмотреть заранее, так как здесь не делается никаких проверок на доступность съемного диска.
Теперь мы знаем серийный номер диска. В моем случае это «-1109467269″. Именно так, со знаком минус. Теперь создадим файл flash_run.js, или с другим именем, и вставим следующий код:
fso = WScript.Createobject(«Scripting.FileSystemObject»); // Обявление объекта для работы с файловой системой
A = new Array(«C»,»D»,»F»,»E»,»J»,»I»,»K»,»L»,»G»,»M»); // Создание массива с именами восзможных дисков
f=A.length; // вычислим длину массива
ok=0; // вспомогательная переменная
for (var icount = 0; icount
if (fso.DriveExists(A[icount])){ // проверяем существует ли такой диск
d = fso.GetDrive(A[icount]); // если такой диск существует, создаем объект для работы с ним
if (d.IsReady){ // проверим готовность диска
if (d.SerialNumber==-1109467269) // сравниваем серийный номер
{ //если номер совпадает, то:
var WSHShell = WScript.CreateObject(«WScript.Shell»); создаем объект, необходимый для запуска внешнего требуемого приложения
path=A[icount]+»:\\WebServers\\etc\\run» // зададим путь к нашему приложению. В перемнной массива A[icount] содержится буква нашей флешки, а остальное – путь к требуемой программе, где нужно указать свой путь.
WSHShell.Run(path,5); // запуск приложения по пути, прописанном в переменной path
ok=1; // меняем значение вспомогательной переменной
break; // останавливаем работу цикла
}
}
}
} // конец цикла for
if (ok==0) WScript.Echo(«Флешка не найдена»); // если диска, с указанным серийным номером, не будет найдено, значение переменной k останется нулевым. Выводим сообщение.
Комментариев больше, чем самого кода.
Возможно, эту задачу можно было решить и по-другому, даже гораздо проще. Если это так, то буду рад узнать, каким образом. А с помощью методов, использованных в этом скрипте, можно решить еще одну задачу – резервного копирования с флешки. Об этом чуть поздней.
Обновление: Действительно, это было решение весьма специфическое, как я и написал в начале поста
