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

BKPB 04-06-2020 17:20 2923997

Удаление ярлыка от не существующей программы
 
Нужна команда для удаления ярлыка от не существующей программы.
Ярлык находится в C:\Users\Администратор ПК\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
имя ярлыка OneDrive
Так не удаляется:
del/q/f "%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"
del/q/f "%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive"
del /f /s /q "%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"
if exist "%AppData%\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk" del /Q /F "%ALLUSERSPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"
del/q/f "%LocalAppData%\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"
del/q/f "%LocalAppData%\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"

iglezz 04-06-2020 17:42 2923999

Банальная отладка через
Код:

echo "%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"
показала бы, что с путями тут всё очень не так, как надо.

Для пути C:\Users\Администратор ПК\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
%AppData% = C:\Users\Администратор ПК\AppData\Roaming

Соответственно,
Код:

:: вместо
del/q/f "%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"
:: должно быть
del/q/f "%AppData%\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"

И так далее...

BKPB 04-06-2020 17:59 2924001

iglezz,
Спасибо, за помощь.
Решение:
del/q/f "%AppData%\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk"

Iska 04-06-2020 23:52 2924025

А ещё лучше WSH/PoSH, где есть доступ к псевдонимам, таким, как, например, «shell:Programs» :).

greg zakharov 06-06-2020 16:51 2924208

Пример написан на коленке, но закомментирован, чтобы было понятно что к чему.
Код:

@echo off
  setlocal enabledelayedexpansion
    call:getShellFolder Programs
    call:getPathFromLink Programs OneDrive
    if not exist "!OneDrive!" (
      echo del /f/q "!Programs!\OneDrive.lnk"
    )
  endlocal
exit /b

:: получение пути шелл-папки по схеме shell::{guid} не всегда срабатывает в
:: командных сценариях, поэтому излекаем путь нужной папки из реестра
:getShellFolder
  set "key=HKCU\Software\Microsoft\Windows\CurrentVersion"
  set key="!key!\Explorer\Shell Folders"
  for /f "tokens=2,*" %%i in ('2^>nul reg query !key! /v %~1') do set "%~1=%%j"
exit /b

:: далее нужно проверить валидность ярлыка, для этого язвлекаем путь из
:: последнего с помощью простых паттернов find и findstr
:getPathFromLink
  for /f "delims=" %%i in (
    'find "\" ^< "!%~1!\%~2.lnk" ^| findstr /ric:"\..*$"'
  ) do set "%~2=%%i"
  rem если путь содержит переменную окружения, раскрываем ее в полный путь
  for /f "delims=" %%i in ('echo !%~2! ^| findstr /rc:"."') do set "%~2=%%i"
  rem удаляет метку версии, если таковая затесалась в путь
  if /i "!%~2:~1,1!" neq ":" set "%~2=!%~2:~1!"
exit /b



Время: 20:56.

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