1

Тема: Работа с ярлыками с помощью WshShortcut.

Парни, подскажите кто знает!
Передо мной поставлена такая задача:
Написать скрипт, который проверял бы соответствие всех ярлыков на рабочем столе реальным файлам на диске и уничтожал бы те ярлыки, для которых файл, на который он ссылается, не существует. Список удаленных ярлыков заносить в файл в формате “Дата удаления: Имя ярлыка, Путь к связанному файлу”.
Так вот, Как писать в файл и удалять файлы - я знаю! А вот как мне проверить то, что файл, на который ссылается ярлык - есть на диске!
Вот я тут набросал:

//-------------------------------------------------------
var wh=WScript.CreateObject("WScript.Shell");
FSO = WScript.CreateObject("Scripting.FileSystemObject");
var DesktopPath = wh.SpecialFolders("Desktop"); 
var Desk = FSO.GetFolder(DesktopPath);
var yarl = new Enumerator(Desk.Files);
for(;!yarl.atEnd(); yarl.moveNext())
    {
    var ssylka = yarl.item();
    WScript.Echo(ssylka.Name);
    }    
//-------------------------------------------------------

Ну это я получаю список файлов на рабочем столе! А вот про WshShortcut в интернете я вообще ничего не нахожу.... Везде только про создание ярлыка - WshShell.CreateShortcut, но это я знаю..... Ну вот что-то типо этого:
http://msdn.microsoft.com/en-us/library … s.84).aspx
А как проверить параметр ярлыка TargetPath - полное имя ресурса на который ссылается ярлык. Подскажите кто знает! Заранее благодарен!

2

Re: Работа с ярлыками с помощью WshShortcut.

sniperni пишет:

... Везде только про создание ярлыка - WshShell.CreateShortcut, но это я знаю.....

Не совсем так. Правильнее сказать - метод .CreateShortcut создает не ярлык, а объект IWshShortcut. А уже этот объект, в свою очередь, имеет метод .Save, позволяющий создать файл ярлыка на диске по указанному полному пути, если таковой не существовал, а если файл уже существовал - обновляет свойства этого ярлыка (http://www.script-coding.com/WSH/WshShell.html#5.). В данном случае нужен только объект IWshShortcut и его свойство TargetPath, следующий шаг в Вашем скрипте я вижу таким:

//-------------------------------------------------------
var wh=WScript.CreateObject("WScript.Shell");
FSO = WScript.CreateObject("Scripting.FileSystemObject");
var DesktopPath = wh.SpecialFolders("Desktop"); 
var Desk = FSO.GetFolder(DesktopPath);
var yarl = new Enumerator(Desk.Files);
for(;!yarl.atEnd(); yarl.moveNext())
    {
    var ssylka = yarl.item();
    // WScript.Echo(ssylka.Name);
    if (FSO.GetExtensionName((ssylka.Path).toLowerCase()) == "lnk") {
        var WshShortcut = wh.CreateShortcut(ssylka.Path);
        if (!FSO.FileExists(WshShortcut.TargetPath)) {
            WScript.Echo("Shortcut [" + ssylka.Name + "]\nTarget [" + WshShortcut.TargetPath + "]\nnot found")
        }
        else {
            WScript.Echo("Shortcut [" + ssylka.Name + "]\nTarget [" + WshShortcut.TargetPath + "]\nOK")
        };
    };
    }    
//-------------------------------------------------------
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

3

Re: Работа с ярлыками с помощью WshShortcut.

Большое спасибо omegastripes. Теперь всё стало понятно!

4 (изменено: sniperni, 2013-10-31 12:20:42)

Re: Работа с ярлыками с помощью WshShortcut.

Вот конечный вариант скрипта и его ТЗ - может кому-то понадобится!
ТЗ: Написать скрипт, который проверял бы соответствие всех ярлыков на рабочем столе реальным файлам на диске и уничтожал бы те ярлыки, для которых файл, на который он ссылается, не существует. Список удаленных ярлыков заносить в файл в формате “Дата удаления: Имя ярлыка, Путь к связанному файлу”.
Скрипт:

//-------------------------------------------------------
var wh=WScript.CreateObject("WScript.Shell");
FSO = WScript.CreateObject("Scripting.FileSystemObject");
var DesktopPath = wh.SpecialFolders("Desktop"); 
var Desk = FSO.GetFolder(DesktopPath);
var yarl = new Enumerator(Desk.Files);
for(;!yarl.atEnd(); yarl.moveNext())
    {
    var ssylka = yarl.item();
    if (FSO.GetExtensionName((ssylka.Path).toLowerCase()) == "lnk") 
    {
        var WshShortcut = wh.CreateShortcut(ssylka.Path);
        if (!FSO.FileExists(WshShortcut.TargetPath)) {
            WScript.Echo("Найден ярлык на рабочем столе: "+ ssylka.Name +"\nПуть к файлу: "+ WshShortcut.TargetPath +"\nФайл не найден!\nУдаляем ярлык, записываем информацию о нём в файл!")
        //--------------------------------------------------------------------
        // заносим информацию о удаляемом ярлыке в файл
        var part=wh.CurrentDirectory;
        var strDoc=part+"\\Zadanie.doc";
        var F=FSO.GetFolder(part) ;
        //получаем текущую дату
        var d = new Date();   
        var strText="Удаляем ярлык с рабочего стола на несуществующий файл:\nДата удаления: ";  
        //извлекаем день                     
        strText += d.getDate() + "/";  
        //месяц          
        strText += (d.getMonth() + 1) + "/"; 
        //год            
        strText += d.getYear()+"\n";
        // записываем имя ярлыка
        strText += "Имя ярлыка: "+ssylka.Name+"\n";
        // записываем путь к связанному файлу
        strText += "Путь к файлу: "+WshShortcut.TargetPath+"\n";
        strText += "#--------------------------------#\n";
        // Проверяем создан ли документ, если нет - создаём и пишем в него, если да, то просто дописываем
        if (!WScript.CreateObject("Scripting.FileSystemObject").FileExists(strDoc)) 
        {
            file=FSO.CreateTextFile(strDoc);
             file.WriteLine(strText);
             file.Close ();     
        }        
        else
        {
            var oWord=WScript.CreateObject("word.Application")
              var oDoc=oWord.Documents.Open(strDoc);
              oDoc.Content.InsertAfter(strText)
              oDoc.Save();
              oDoc.Close();
              oWord.Quit();
            
        }
        WScript.Echo("Запись о ярлыке внесена в документ: "+ strDoc)
        //--------------------------------------------------------------------
        // удаляем ярлык с рабочего стола
        var inf = ssylka.Name;
        file=FSO.GetFile(Desk+"\\"+ssylka.Name);
        file.Delete();
        WScript.Echo("Ярлык "+ inf +" успешно удалён!\n#----------------------------#")
        //--------------------------------------------------------------------
        }
        else {
            WScript.Echo("Найден ярлык на рабочем столе: "+ ssylka.Name +"\nПуть к файлу: "+ WshShortcut.TargetPath +"\nФайл найден!\n#----------------------------#")
        };
    };
    }    
//-------------------------------------------------------