Creating a Shortcut File with WSH Interop

Windows shortcut link files (.lnk) are odd creatures. They use a strange binary format documented here (pdf).

Run tlbimp. See Interop introduction for more information: tlbimp %SystemRoot%\system32\wshom.ocx /out:Interop.IWshRuntimeLibrary.dll

Or use ProgID "WScript.Shell".

Here is the documentation for the Windows Scripting Host Objects (warning: dumb IE only website).

We can then add a reference to the dll and use WshClass to create new shortcuts: import clr import sys sys.path.append(DIRECTORY_CONTAINING_INTEROP_DLL)

clr.AddReferenceToFile('Interop.IWshRuntimeLibrary.dll') from Interop.IWshRuntimeLibrary import WshShellClass

shortcut = WshShellClass.CreateShortcut('c:\\Test\\SomeFile.lnk') shortcut.TargetPath = targetPathName shortcut.Save

This uses the WshShell Class to create a WshShortcut. (Warning: Same dumb IE only site I'm afraid.)

The WshShorcut has lots of interesting properties that you can set. shell = WshShellClass shortcut = shell.CreateShortcut('c:\\Test\\SomeFile.lnk') shortcut .TargetPath = targetPathName shortcut.WindowStyle = 1 shortcut.Hotkey = "CTRL+SHIFT+F" shortcut.IconLocation = "notepad.exe, 0" shortcut.Description = "Shortcut Script" shortcut.WorkingDirectory = "c:\\Temp" shortcut.Save

Bizarrely, you can't use this interface for examining an existing link - you need to use Shell32 interop instead...

See Reading the Target of a Shortcut with Shell32 Interop.

For yet another way to create a shortcut with Ironpython. This time, using the PreferComDispatch feature of IronPython 2.0 B1. from System import Type, Activator wb = Activator.CreateInstance(Type.GetTypeFromProgID("WScript.Shell")) Desktop = wb.SpecialFolders("Desktop") ShellLink = wb.CreateShortcut(Desktop + "\Notepad.lnk") ShellLink.TargetPath = "notepad.exe" ShellLink.WindowStyle = 1 ShellLink.Hotkey = "CTRL+SHIFT+F" ShellLink.IconLocation = "notepad.exe, 0" ShellLink.Description = "Shortcut Script" ShellLink.WorkingDirectory = Desktop ShellLink.Save

Run this with the -X:PreferComDispatch option for this to work. Note this feature is planned to be enabled by default.

Back to Contents.