Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to create a SendTo Notepad shortcut.
Microsoft Scripting Guy, Ed Wilson, is here. I absolutely love using Windows 8. To me, it is the best operating system we have ever released at Microsoft. I am especially proud that some of the Help articles I wrote are actually included with Windows PowerShell Help—it is so cool!
Anyway, one of my favorite things to do is to have a shortcut to Notepad in the SendTo special folder. This way, I can open and look at a lot of things without having to change file associations. I simply right-click, and select Notepad from the SendTo menu. In Windows 8, this is not a default location.
In the following image, I right-click the CreatePoshOrgPro… script, and point to Send to, but Notepad.exe is not listed as a default location to send items.
Finding the SendTo folder
Ok, so I know that SendTo is a special folder. I guess I can open my user profile folder, find the SendTo folder and create a shortcut to Notepad there—I have done this literally dozens of times over the past few years. But when I attempt to do this, I get access denied. On closer inspection, the SendTo folder is not a real folder, but it redirects to another location.
Hmm … So I squirrel around trying to find where we hid the SendTo folder, and then I was reading over the text of my new Windows PowerShell 3.0 Step by Step book by Microsoft Press, and I ran across the section where I talked about using the old-fashioned WshShell object. It dawned on me that I could use this object to completely solve my problem. To begin with, the WshShell object is a COM object, so I need to create an instance of the object by using New-Object. I store the returned COM object in the $wshshell variable, as shown here.
$wshshell = New-Object -com wscript.shell
When I call the SpecialFolders property, I receive a listing of all the special folders about which the object knows. Here is the syntax I use.
$wshshell.SpecialFolders
The command and the output from the command are shown in the following image.
It is common that many COM objects have an itemmethod. I decide to see if the SpecialFolders collection has one … if it does, I will feed it the specific SendTofolder. As shown here, the command works great.
11:08 C:\> $wshshell.SpecialFolders.Item("sendto")
C:\Users\ed.IAMMRED\AppData\Roaming\Microsoft\Windows\SendTo
So I have the path to the SendTo folder …
I paste the path from the $wshshell.SpecialFolders.Item("sendto") command to the Windows Explorer path bar, and sure enough the SendTo folder opens. While I am there, I decide to delete a few things I never use.
I could go ahead and create a new shortcut here, but, dude, that would be like using the GUI and would be the first step to becoming a button monkey … somehow I cannot see myself doing that.
The SendTo folder is shown in the following image.
Hey, I bet I can script it …
Well, it did not take much time to knock off a quick script. The first thing I need to do is to create the WshShell object and get the path to the SendTo folder—I had already written that code.
$wshshell = New-Object -com wscript.shell
$path = $wshshell.SpecialFolders.Item("sendto")
Next, I need to create a path to use for the shortcut. I like to use Join-Path to create paths because it reduces possible concatenation errors.
$shortcutPath = Join-Path -Path $path -ChildPath "Notepad.lnk"
Now, I need to call the CreateShort method and pass the path for the shortcut. I have to store the returned object, because I need to specify a couple of properties. I put the object in the $shortcut variable.
$shortcut = $wshshell.CreateShortcut($shortcutPath)
Now, I need to specify the target—because Notepad is a well-known application I can avoid specifying the full path to the file. The description is not a requirement, but I like to fill out descriptions when they are available.
$shortcut.TargetPath = "Notepad.exe"
$shortcut.Description = "Created by Powershell 3.0"
Finally, I need to save my work and create the shortcut.
$shortcut.Save()
I mouse over to the SendTo folder, and cool it worked!
CreateNotePadShortCutInSendTo.ps1
$wshshell = New-Object -com wscript.shell
$path = $wshshell.SpecialFolders.Item("sendto")
$shortcutPath = Join-Path -Path $path -ChildPath "Notepad.lnk"
$shortcut = $wshshell.CreateShortcut($shortcutPath)
$shortcut.TargetPath = "Notepad.exe"
$shortcut.Description = "Created by Powershell 3.0"
$shortcut.Save()
I uploaded the complete CreateNotePadShortCutInSendTo.ps1 script to the Scripting Guys Script Repository to make it easy for you to use the code.
I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.
Ed Wilson, Microsoft Scripting Guy