(Solucionado) [Batch] ¿Como conseguir informacion de un acceso directo? (.lnk)

Iniciado por SuperDraco, 12 Mayo 2011, 02:05 AM

0 Miembros y 1 Visitante están viendo este tema.

SuperDraco

Hola   ;D

Despues de muchos intentos fracasados y de mucho buscar, me veo obligado a preguntar... :xD

Necesito hacer un batch, y lo único que se me resiste es esta parte... en donde necesito obtener y/o mostrar de alguna manera la ruta de destino de un acceso directo, un archivo .lnk, me refiero a esto:



Esa ruta es la que necesito conseguir vía CMD...


Básicamente lo que pretendo hacer es un batch que examine los accesos directos en busca de accesos directos rotos (Por eso quiero obtener la ruta de destino o conseguir expandir el acceso directo a la ruta de destino), y eliminarlos.


He probado haciendo este batch, sabiendo que no iba a funcionar... porque la ruta que me proporciona el comando "echo",es la del "dir", pero bueno, tenía que intentarlo... ni falta decir que he probado a expandirlo con todas las formas que hay XD

@echo off
For /F "Tokens=*" %%A in ('dir /B /S "C:\prueba\*.lnk"') do (
echo %%~fA
pause
)




Tambien he probado a usar de mil maneras el rundll32 con esta API, pero los resultados han sido nulos, creo que este es el buen camino pero no se utilizarlo bien:

rundll32.exe shell32.dll,SHObjectProperties,C:\Prueba\WindowsUpdate.lnk

(Aunque de todas formas imagino que usando la api lo único que conseguiría es abrir una ventana de propiedades del archivo, cuando yo solo quiero obtener la información dentro del cmd para usar esos datos como parámetro...)


También he intentado usar el programa mediainfo (command line) para que me mostrase información acerca del acceso directo, pero nada... solo me muestra el tamaño del archivo, y tambien he probado con programas para crear accesos directos como XXMKLINK para ver si me dejaba editar un .lnk o sacarle información, pero tampoco...


¿Alguien sabe de alguna manera para conseguir lo que pido?



Espero que si!  ::) Gracias de antemano...


PD: No se si tal vez me podría servir tambien un vbscript... solamente me serviría si el vbscript diese un código "errorlevel" en mi batch... y no se si eso es posible. Para que me entendais, usando un vbs debería ser así:

@echo off
For /F "Tokens=*" %%A in ('dir /B /S "C:\prueba\*.lnk"') do (

Script para saber si la ruta de destino del acceso directo existe, o si de lo contrario el acceso directo está roto.vbs < %%A

If %errorlevel% EQU 0 echo Todo OK
If %errorlevel% GEQ 1 echo El acceso directo está roto & del /q %%A


Supongo que se ha entendido ... XD

Ojalá alguien tenga un vbs así ya echo, un batch, o cualquier cosa puf...

saludosss
No he vuelto, solo estoy de paso.

Novlucker

Código (vb) [Seleccionar]
set objshell = createobject("wscript.shell")
set objlink = objshell.createshortcut(wscript.arguments(0))
set objfso = createobject("scripting.filesystemobject")
if objfso.fileexists(objlink.targetpath) then
wscript.quit(0)
else
wscript.quit(1)
end if


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

SuperDraco

#2
Me funciona perfecto, haces que todo parezca tán fácil en VBS... XD

graciasss








este batch elimina los accesos directos rotos del menú inicio, y todas las carpetas vacias (0 bytes) ^^





Código (dos) [Seleccionar]
@echo off
setlocal enabledelayedexpansion



:Accesos directos rotos

For /F "Tokens=*" %%a in ('dir /B /S "%appdata%\Microsoft\Windows\Start Menu\Programs\*.lnk"') do (
Set archivo="%%a"
call :comprobar)



For /F "Tokens=*" %%a in ('dir /B /S "%ProgramData%\Microsoft\Windows\Start Menu\Programs\*.lnk"') do (
Set archivo="%%a"
call :comprobar)




:Carpetas vacias

For /F "Tokens=*" %%a in ('dir /B /S /A:D "%appdata%\Microsoft\Windows\Start Menu\Programs\"') do (
If %%~za EQU 0 rd /Q /S "%%a")


For /F "Tokens=*" %%a in ('dir /B /S /A:D "%ProgramData%\Microsoft\Windows\Start Menu\Programs\"') do (
If %%~za EQU 0 rd /Q /S "%%a")






exit





:Comprobar
Comprobar.vbs !archivo!

If %errorlevel% EQU 0 (
goto:eof
) ELSE (
Del /Q /F !archivo!
goto:eof
)
No he vuelto, solo estoy de paso.