Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Нужна помощь в удалении ярлыка с раб.стола (http://forum.oszone.net/showthread.php?t=223376)

morozov_s_v 20-12-2011 15:49 1818768

Нужна помощь в удалении ярлыка с раб.стола
 
Добрый день. Прошу вас помочь в написании обратного действия на удаление 1)одного и 2) ряда каких либо ярлыков с рабочего стола пользователя.
Вот пример создания ярлыка, что в нем надо добавить или поменять в первом и во втором случае.
Спасибо вам.
------------------------------------------------------------------------------------------------------------
Set WshShell = WScript.CreateObject("WScript.Shell")

strDesktop = WshShell.SpecialFolders("Desktop")

Set oMyShortCut= WshShell.CreateShortcut(strDesktop & "\GARANT.lnk")

oMyShortCut.TargetPath = "\\server\Garant-Client\garant.exe"

oMyShortCut.WorkingDirectory = "\\server\Garant-Client"

oMyShortCut.Description = "GARANT"

oMyShortCut.Save
------------------------------------------------------------------------------------------------------------

Iska 20-12-2011 16:59 1818835

Удаление ярлыков ничем не отличается от удаления прочих файлов: Working with Files. Приведённый Вами код излишен для этого.

morozov_s_v 21-12-2011 16:18 1819513

Цитата:

Цитата Iska
Удаление ярлыков ничем не отличается от удаления прочих файлов: Working with Files. Приведённый Вами код излишен для этого. »

Прошу помочь разобраться.
сможете написать пример ?

sov44 21-12-2011 16:43 1819523

Цитата:

Цитата morozov_s_v
сможете написать пример ? »

для начала нужно понять, для каких пользователей создан ярлык.
C:\Documents and Settings\Пользователь\Рабочий стол\STDU Viewer.lnk
C:\Documents and Settings\All Users\Рабочий стол\STDU Viewer.lnk

для всех пользователей:
Код:

;Удалить ярлык с рабочего стола
Del /q "%ALLUSERSPROFILE%\Рабочий стол\STDU Viewer.lnk"

Сохранять в 866 кодировке.

Iska 21-12-2011 19:44 1819640

Цитата:

Цитата morozov_s_v
Прошу помочь разобраться.
сможете написать пример ? »

Пример удаления есть в вышеприведённой ссылке Working with Files. Что именно Вам не понятно?

Dragokas 21-12-2011 19:57 1819661

sov44, это не будет работать на Win7.

Попробуйте это:
Код:

@echo off
chcp 1251
setlocal
set files=Русс.lnk 1111*.lnk *z.lnk
%homedrive%
if exist "%homedrive%%homepath%\desktop" (set homedesk=desktop) else (set homedesk=Рабочий стол)
if exist "%public%" (set comdesk=%public%\%homedesk%) else (set comdesk=%allusersprofile%\%homedesk%)
chdir "%homedrive%%homepath%\%homedesk%"
for %%a in (%files%) do (del /q "%%a"&del /q "%comdesk%\%%a" >nul)
endlocal
chcp 866

1) Можно сохранить в блокноте, не обязательна кодировка 866.
2) Работает и на ХР, и на Win7.
3) Удаляет указанные файлы на рабочем столе пользователя и общем.
Файлы для удаления размещайте в секции "set files=" через пробел (все ярлыки имеют расширение .lnk)

sov44 05-01-2012 20:43 1829184

Подскажите, как удалить ярлыки по умолчанию ( IE, Windows media, Проводник) в Windows 7 из панели быстрого запуска?
Ярлыки находились в папке User Pinned (%AppData%\Microsoft\Internet Explorer\Quick Launch\User Pinned\). Папка удалена, но ярлыки с панели не пропали. :(

Lucretius 13-09-2013 18:18 2217398

А возможно ли удалить ярлык с произвольным именем, зная только путь к файлу ярлыка?

Iska 13-09-2013 20:57 2217481

Lucretius, а если там десять ярлыков — и какой из них Ваш?!

Что-нибудь ещё об ярлыке известно? На что указывает, например?

Lucretius 14-09-2013 18:24 2217822

Iska, я имел в виду, что известен только путь к файлу на который ссылается ярлык. Сам ярлык находиться на рабочем столе пользователя.

Iska 14-09-2013 20:08 2217873

Цитата:

Цитата Lucretius
Iska, я имел в виду, что известен только путь к файлу на который ссылается ярлык. »

«Ну, так это совсем другое дело!»

Код:

Option Explicit

Dim strGoalTargetPath

Dim objFolder

Dim objFSO
Dim objFile

Dim objWshShell
Dim objWshShortcut


strGoalTargetPath = "C:\WINDOWS\system32\calc.exe"

Set objFolder = WScript.CreateObject("Shell.Application").NameSpace("shell:Desktop")

If Not objFolder Is Nothing Then
        Set objWshShell = WScript.CreateObject("WScript.Shell")
        Set objFSO      = WScript.CreateObject("Scripting.FileSystemObject")
       
        For Each objFile In WScript.CreateObject("Scripting.FileSystemObject").GetFolder(objFolder.self.Path).Files
                If LCase(objFSO.GetExtensionName(objFile.Name)) = "lnk" Then
                        Set objWshShortcut = objWshShell.CreateShortcut(objFile.Path)
                       
                        If LCase(objWshShortcut.TargetPath) = LCase(strGoalTargetPath) Then
                                WScript.Echo objFile.Name, objWshShortcut.TargetPath
                                'objFile.Delete True
                        End If
                End If
        Next
       
        Set objWshShell = Nothing
        Set objFSO      = Nothing
Else
        WScript.Echo "Can't determine user desktop folder"
End If

WScript.Quit 0

Если корректно находит потребный ярлык — раскомментируйте выделенную строку для удаления ярлыка, ссылающегося на заданный объект.

Lucretius 15-09-2013 16:47 2218298

Iska, спасибо! Если Вас не затруднит, добавьте пожалуйста в скрипт:

1. Вызов скрипта с аргументом (wscript.exe "ShortcutDel.vbs" "полный путь к файлу")
2. Перед удалением скопировать найденные ярлыки в директорию со скриптом.

Iska 15-09-2013 17:34 2218318

Цитата:

Цитата Lucretius
1. Вызов скрипта с аргументом (wscript.exe "ShortcutDel.vbs" "полный путь к файлу") »

Снимаю шляпу: крайне редко кто понимает, как сие должно реализовываться. Настолько редко, что я уже перестал сие делать, поскольку в абсолютном большинстве случаев после выкладывания правильного подхода от вопрошающего тут же появляется вопрос: «А можно попроще, чтобы прямо в пакетном файле/скрипте вбивать путь?». И никакие объяснения, что именно так, как сделано, и есть — правильно, не помогают.

Цитата:

Цитата Lucretius
3. Удаление найденных ярлыков с рабочего стола с подавлением запроса на удаление. »

А сейчас разве как-то по-другому происходит?

Пробуйте:
читать дальше »
Код:

Option Explicit

Dim strGoalTargetPath

Dim objFolder

Dim objFSO
Dim objFile

Dim objWshShell
Dim objWshShortcut


If WScript.Arguments.Count = 1 Then
        strGoalTargetPath = WScript.Arguments.Item(0)
       
        Set objFolder = WScript.CreateObject("Shell.Application").NameSpace("shell:Desktop")
       
        If Not objFolder Is Nothing Then
                Set objWshShell = WScript.CreateObject("WScript.Shell")
                Set objFSO      = WScript.CreateObject("Scripting.FileSystemObject")
               
                For Each objFile In WScript.CreateObject("Scripting.FileSystemObject").GetFolder(objFolder.self.Path).Files
                        If LCase(objFSO.GetExtensionName(objFile.Name)) = "lnk" Then
                                Set objWshShortcut = objWshShell.CreateShortcut(objFile.Path)
                               
                                If LCase(objWshShortcut.TargetPath) = LCase(strGoalTargetPath) Then
                                        objFile.Copy objFSO.GetParentFolderName(WScript.ScriptFullName) & "\", True
                                       
                                        objFile.Delete True
                                End If
                        End If
                Next
               
                Set objWshShell = Nothing
                Set objFSO      = Nothing
        Else
                WScript.Echo "Can't determine user desktop folder"
                WScript.Quit 2
        End If
Else
        WScript.Echo "Usage: " & WScript.ScriptName & " <Path to shortcut target>"
        WScript.Quit 1
End If

WScript.Quit 0


Lucretius 15-09-2013 17:53 2218336

Спасибо большое! Всё работает. Под "запрос на удаление" я ошибочно принял вывод:
Код:

WScript.Echo objFile.Name, objWshShortcut.TargetPath
отредактировал в сообщении.

Iska 15-09-2013 18:31 2218354

Lucretius, ясно.

Нет, это был просто вывод отладочного сообщения, для того, чтобы убедиться, что находится именно то, что нужно.

P.S. Если у Вас есть целый набор целей — можем сделать так, что Вы их перечисляете в текстовом файле и указываете этот файл в качестве аргумента скрипта.

Lucretius 15-09-2013 23:02 2218502

Iska, ещё раз спасибо, у меня последний вопрос - как добавить в скрипт создание ярлыка? Т.е. такая последовательность работы скрипта: копирование >удаление >создание с параметрами по умолчанию. Тему читал: "Создание ярлыков при установке ОС", но мне не удаётся внести изменения в приведённый Вами скрипт.

Iska 16-09-2013 00:46 2218545

Lucretius, приведите, для моего понимания, конкретный пример — что удаляете, что создаёте.

Цитата:

Цитата Lucretius
такая последовательность работы скрипта: копирование >удаление >создание с параметрами по умолчанию. »

1. Что есть «копирование»?
2. Что есть «параметры по умолчанию»?

Lucretius 16-09-2013 07:47 2218599

Iska,
Последовательность выполнения скрипта:
  1. Вызов скрипта с аргументом (wscript.exe "Shortcut.vbs" "полный путь к исполняемому файлу")
  2. Поиск ярлыка на рабочем столе пользователя по аргументу вызова (имя ярлыка неизвестно)
  3. Копирование найденного ярлыка в директорию со скриптом.
  4. Удаление найденного ярлыка с рабочего стола пользователя
  5. Создание ярлыка на рабочем столе пользователя с параметрами по умолчанию
Т.е. скрипт который Вы привели здесь, завершающим этапом выполнения которого будет создание ярлыка , где:
  • Путь к исполняемому файлу на который ссылается ярлык = аргумент вызова
  • Имя ярлыка = имя исполняемого файла
  • Рабочая папка = папка расположения исполняемого файла
остальные параметры ярлыка такие, как если бы он был создан через контекстное меню проводника, т.е. стиль открытия окна, клавиши быстрого вызова, комментарий, права запуска и т.д. - оставить по умолчанию(без изменений).

Iska 16-09-2013 21:14 2218982

Lucretius, в чём тогда смысл:
Цитата:

Цитата Lucretius
Удаление найденного ярлыка с рабочего стола пользователя »

+
Цитата:

Цитата Lucretius
Путь к исполняемому файлу на который ссылается ярлык = аргумент вызова »

? Чем не устраивает уже существующий аналогичный же ярлык? Что в нём не так? И зачем его нужно копировать в папку скрипта?

Lucretius 16-09-2013 22:10 2219011

Iska, скрипт будет работать в составе патча к программе, сама программа имеет два исполняемых файла(или один - опционально в процессе инсталляции) и создаёт ярлыки только в меню пуск, что весьма не удобно. Предполагаю, что большинство пользователей вручную создаёт ярлык(и) на рабочем столе. Поэтому при согласии пользователя создать ярлык(и) на рабочем столе - запускается скрипт и создаёт ярлыки со стандартным именем/параметрами (без «ярлык для», «запуск от» – патч вносит изменения в манифест и т.д.) предварительно скопировав ярлык(и) созданные пользователем в папку скрипта(backup) на случай прерывания работы патча(по желанию пользователя или иным причинам) и «отката» всех сделанных изменений. Удалить ярлыки с рабочего стола необходимо по понятной причине — избежать создание дублей. Во всяком случае такой вариант меня устраивает и я буду очень признателен если, Вы поможете мне.

Iska 17-09-2013 01:24 2219097

Lucretius, ясно.

В таком случае, будет гораздо лучше, если в качестве имени ярлыка будет выступать не имя исполняемого файла, а имя из свойств исполняемого файла (если оно есть; жаль, что Вы не называете продукт), например, не «NOTEPAD.EXE.lnk», а «Блокнот.lnk».

Пробуйте:
читать дальше »
Код:

Option Explicit

Dim strGoalTargetPath

Dim objShell
Dim objFolder

Dim objFSO
Dim objFile

Dim objWshShell
Dim objWshShortcut

Dim objFolderItem

Dim strShortcutFilePath
Dim strShortcutFileName


If WScript.Arguments.Count = 1 Then
        strGoalTargetPath = WScript.Arguments.Item(0)
       
        Set objShell  = WScript.CreateObject("Shell.Application")
        Set objFolder = objShell.NameSpace("shell:Desktop")
       
        If Not objFolder Is Nothing Then
                Set objWshShell = WScript.CreateObject("WScript.Shell")
                Set objFSO      = WScript.CreateObject("Scripting.FileSystemObject")
               
                For Each objFile In WScript.CreateObject("Scripting.FileSystemObject").GetFolder(objFolder.self.Path).Files
                        If LCase(objFSO.GetExtensionName(objFile.Name)) = "lnk" Then
                                strShortcutFilePath = objFile.Path
                                Set objWshShortcut = objWshShell.CreateShortcut(strShortcutFilePath)
                               
                                If LCase(objWshShortcut.TargetPath) = LCase(strGoalTargetPath) Then
                                        objFile.Copy objFSO.GetParentFolderName(WScript.ScriptFullName) & "\", True
                                        objFile.Delete True
                                       
                                        Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strGoalTargetPath))
                                       
                                        If Not objFolder Is Nothing Then
                                                Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strGoalTargetPath))
                                               
                                                If Not objFolderItem Is Nothing Then
                                                        strShortcutFileName = Trim(CStr(objFolder.GetDetailsOf(objFolderItem, 36)))
                                                       
                                                        If Len(strShortcutFileName) > 0 Then
                                                                strShortcutFilePath = objFSO.BuildPath(objFSO.GetParentFolderName(strShortcutFilePath), strShortcutFileName & ".lnk")
                                                        End If
                                                End If
                                        End If
                                       
                                       
                                        Set objWshShortcut = objWshShell.CreateShortcut(strShortcutFilePath)
                                       
                                        With objWshShortcut
                                                .TargetPath      = strGoalTargetPath
                                                .WorkingDirectory = objFSO.GetParentFolderName(strGoalTargetPath)
                                                .Description      = strShortcutFileName
                                               
                                                .Save
                                        End With
                                End If
                        End If
                Next
               
                Set objWshShell = Nothing
                Set objFSO      = Nothing
        Else
                WScript.Echo "Can't determine user desktop folder"
                WScript.Quit 2
        End If
       
        Set objFolder = Nothing
        Set objShell  = Nothing
Else
        WScript.Echo "Usage: " & WScript.ScriptName & " <Path to shortcut target>"
        WScript.Quit 1
End If

WScript.Quit 0


Обращаю Ваше внимание, что «36» в:
Код:

strShortcutFileName = Trim(CStr(objFolder.GetDetailsOf(objFolderItem, 36)))
специфично исключительно для Windows 5.1/5.2. Если рассчитано на иные ОС — см. в: GetExtFileProperties() - Get Extended File Properties / Attributes of Files - KiXtart.org - official site. Если рассчитано на множественные ОС — добавляйте проверку версии ОС и выбор соответствующего ей значения.

Lucretius 17-09-2013 23:25 2219604

Iska, спасибо за внимание к моему вопросу.
Цитата:

Цитата Iska
если в качестве имени ярлыка будет выступать не имя исполняемого файла, а имя из свойств исполняемого файла »

- да, это было бы удобно, с условием, что позиции конкретного атрибута совпадают для «живых» версий Win с 5.1 по 6.2, а если ресурс "Version" вообще не имеет записей? Данный способ удобен для получения информации о файле, а задавать имя ярлыка, полагаю, будет «спокойней» через второй параметр вызова. В моём случае имя ярлыка в меню Пуск соответствует: "Product Name". Добавить проверку версии ОС на уровне VBS для меня пока достаточно сложно, я сделал так:
Код:

strShortcutFileName = objFSO.GetBaseName(strGoalTargetPath)
в этом случае создаётся ярлык: "Name.exe.lnk" "Name.lnk"

Приведённый Вами скрипт создаёт ярлыки, только, с условием, что они изначально были на рабочем столе, а для меня важно создать ярлыки на существующие исполняемые файлы(проверка их наличия в системе, происходит до запуска скрипта и передачи ему параметров), а копирование ярлыков пользователя(если они существуют) происходит только с целью backup. Подскажите, как исправить?

Lucretius 18-09-2013 18:04 2219946

Iska, благодарю Вас за помощь, я разобрался. Всё проще, чем казалось.


Время: 16:25.

Время: 16:25.
© OSzone.net 2001-