Компьютерный форум 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=283234)

sov44 06-06-2014 11:01 2360654

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

Iska 06-06-2014 11:07 2360658

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

Цитата:

Цитата sov44
и возможность реализации батником. »

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

sov44 06-06-2014 11:36 2360677

Цитата:

Цитата Iska
Никак. Сторонние утилиты, WSH, PoSH. »

Цитата:

Цитата sov44
возможность реализации батником »

Значит нужно сделать их вызов батником. Ищется реализация.

Iska 06-06-2014 13:11 2360725

Как-то так (перечисление без удаления):
Код:

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 2360940

Код:

@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 2361045

Цитата:

Цитата Georgio
find ":\"^<"%%i"^| find /v "/" »

А если там будет ссылка на сетевой ресурс, ShellLink или это ярлык MSI, которые вообще могут указывать на установленное приложение, но не существующее ещё на диске (это предусмотрено самой технологией)?

sov44 11-06-2014 19:07 2362966

Цитата:

Цитата Iska
А если там будет ссылка на сетевой ресурс, ShellLink или это ярлык MSI, которые вообще могут указывать на установленное приложение, но не существующее ещё на диске (это предусмотрено самой технологией)? »

Georgio, Iska :help: command line only

Iska 11-06-2014 19:59 2362982

sov44, speak in russian, please.

sov44 09-10-2014 12:58 2413023

Цитата:

Цитата Iska
А если там будет ссылка на сетевой ресурс »

Iska, мой вариант. как будет выглядеть батник?

Georgio 09-10-2014 13:10 2413028

sov44, выложите пример такого ярлыка (в архиве).

sov44 09-10-2014 13:30 2413036

Хочется видеть путь типа g:\ConsultantPlus\cons.exe

Iska 09-10-2014 15:36 2413097

Цитата:

Цитата sov44
Iska, мой вариант. как будет выглядеть батник? »

sov44, ничего не понял.

Georgio 09-10-2014 16:49 2413129

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 2413131

Цитата:

Цитата Iska
sov44, ничего не понял. »

:)
Нужно парсить ярлыки рабочего стола, выводить в консоль пути к программам, в том числе и к программам, размещённым на сервере.

sov44 09-10-2014 20:31 2413238

Georgio, спасибо! Работает на тестовом Файле, завтра поэкспериментирую с другими линками.


Время: 20:45.

Время: 20:45.
© OSzone.net 2001-