Войти

Показать полную графическую версию : Удалить неверные ярлыки


sov44
06-06-2014, 11:01
Многие программы-чистильщики имеют возможность удалять с рабочего стола (и не только) неверные ярлыки. Хочется понять принцип их работы и возможность реализации батником (без использования сторонними утилитами).

Iska
06-06-2014, 11:07
Принцип работы простой — проверить существование файлового объекта по целевому пути ярлыка и, в случае его отсутствия, вывести запрос на удаление такого ярлыка.

и возможность реализации батником. »
Никак. Сторонние утилиты, WSH, PoSH. Надо заметить, что работать нужно будет со всеми возможными целями. В том числе и с ShellLink, и с MSI.

sov44
06-06-2014, 11:36
Никак. Сторонние утилиты, WSH, PoSH. »
возможность реализации батником »
Значит нужно сделать их вызов батником. Ищется реализация.

Iska
06-06-2014, 13:11
Как-то так (перечисление без удаления):
Option Explicit

Dim strSourceFolder

Dim objWshShell
Dim objFSO
Dim objShell

Dim objFile
Dim objRecord


Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objShell = WScript.CreateObject("Shell.Application")

strSourceFolder = objWshShell.SpecialFolders("Desktop")

With objFSO
If .FolderExists(strSourceFolder) Then
For Each objFile In .GetFolder(strSourceFolder).Files
If StrComp(.GetExtensionName(objFile.Name), "lnk", vbTextCompare) = 0 Then
On Error Resume Next
Set objRecord = WScript.CreateObject("WindowsInstaller.Installer").ShortcutTarget(objFile.Path)

If Err.Number <> 0 Then
Err.Clear
On Error Goto 0

With objWshShell.CreateShortcut(objFile.Path)
If Not objFSO.FileExists(.TargetPath) Then
With objShell.NameSpace(objFSO.GetParentFolderName(objFile.Path)).ParseName(objFile.Name).GetLink
If Not objFSO.FileExists(.Target.Path) Then
WScript.Echo objFile.Name
End If
End With
End If
End With
Else
On Error Goto 0
Set objRecord = Nothing
End If
End If
Next
Else
WScript.Echo "Can't find Desktop folder [" & strSourceFolder & "]."
End If
End With

Set objShell = Nothing
Set objFSO = Nothing
Set objWshShell = Nothing

WScript.Quit 0

Georgio
06-06-2014, 21:32
@echo off
chcp 1251>nul
for %%i in (*.lnk) do (
for /f "tokens=*" %%j in ('
find ":\"^<"%%i"^| find /v "/"
') do (
chcp 866>nul
if not exist "%%j" (
set /p"=%%~nxj not exist. "<nul
del "%%i"&& (
echo %%~nxi was deleted.
)|| (
echo Failed to delete %%~nxi.
)
)
)
)
pause>nul
exit /b

Iska
07-06-2014, 02:24
find ":\"^<"%%i"^| find /v "/" »
А если там будет ссылка на сетевой ресурс, ShellLink или это ярлык MSI, которые вообще могут указывать на установленное приложение, но не существующее ещё на диске (это предусмотрено самой технологией)?

sov44
11-06-2014, 19:07
А если там будет ссылка на сетевой ресурс, ShellLink или это ярлык MSI, которые вообще могут указывать на установленное приложение, но не существующее ещё на диске (это предусмотрено самой технологией)? »
Georgio, Iska :help: command line only

Iska
11-06-2014, 19:59
sov44, speak in russian, please.

sov44
09-10-2014, 12:58
А если там будет ссылка на сетевой ресурс »
Iska, мой вариант. как будет выглядеть батник?

Georgio
09-10-2014, 13:10
sov44, выложите пример такого ярлыка (в архиве).

sov44
09-10-2014, 13:30
Хочется видеть путь типа g:\ConsultantPlus\cons.exe

Iska
09-10-2014, 15:36
Iska, мой вариант. как будет выглядеть батник? »
sov44, ничего не понял.

Georgio
09-10-2014, 16:49
sov44, как-то так:


@echo off

setlocal enabledelayedexpansion
for %%i in (*.lnk) do (
for /f "tokens=1 delims=[]" %%j in ('
find /n "\\"^<"%%i"
') do (
for /f "tokens=1,2 delims=|" %%k in ('set /a %%j+1^& set /p^=^^^|^<nul^& set /a %%j+2') do (
for /f "tokens=1* delims=[]" %%m in ('find /n /v ""^<"%%i"') do (
if "%%m"=="%%k" set x=%%n
if "%%m"=="%%l" set y=%%n
)
)
if not exist "!x!\!y!" (
echo "!x!\!y!" not exist.
del "%%i"&& (
echo.
echo "%%~nxi" was deleted.
)|| (
echo Failed to delete %%~nxi.
)
echo.
echo.
)
)
)
endlocal

pause>nul
exit /b


.


Неверные ярлыки для несетевых объектов этот пакетный файл удалять не будет.

sov44
09-10-2014, 16:51
sov44, ничего не понял. »
:)
Нужно парсить ярлыки рабочего стола, выводить в консоль пути к программам, в том числе и к программам, размещённым на сервере.

sov44
09-10-2014, 20:31
Georgio, спасибо! Работает на тестовом Файле, завтра поэкспериментирую с другими линками.




© OSzone.net 2001-2012