The requirement: Read a list of files, returning the target if it's a shortcut
Shortcuts are normal files to the file system, but to the Shell subsystem, they represent IShellLink objects with a target path and a few other properties. Since the file system doesn't recognise them as anything unusual, you have to special-case them if you're iterating over files in a directory.
import os, sys import glob import pythoncom from win32com.shell import shell, shellcon def shortcut_target (filename): link = pythoncom.CoCreateInstance ( shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink ) link.QueryInterface (pythoncom.IID_IPersistFile).Load (filename) # # GetPath returns the name and a WIN32_FIND_DATA structure # which we're ignoring. The parameter indicates whether # shortname, UNC or the "raw path" are to be # returned. Bizarrely, the docs indicate that the # flags can be combined. # name, _ = link.GetPath (shell.SLGP_UNCPRIORITY) return name def shell_glob (pattern): for filename in glob.glob (pattern): if filename.endswith (".lnk"): yield "%s => %s" % (filename, shortcut_target (filename)) else: yield filename desktop = shell.SHGetSpecialFolderPath (None, shellcon.CSIDL_DESKTOP) for filename in shell_glob (os.path.join (desktop, "*")): print filename