I’ve made a typo when invoking a script and was surprised by the result.
I decided to investigate and tried to understand what just happened.
Without further suspense, I did actually append a dot at the end of my script.
Whoaaa, notepad opened the script.
I didn’t get an error saying this file path doesn’t exist.
That was such a fast way to open my brave old notepad that this typo might even become my new way of editing scripts 😛
I mean, instead of typing notepad c:\test.ps1, I’ll from now on type c:\test.ps1.
To understand what happened, I first traced side by side my surprising command and the one I was supposed to run:
Trace-Command -Name * -Expression { C:\test.ps1 } -PSHost Trace-Command -Name * -Expression { C:\test.ps1. } -PSHost
At the beginning, everything looks similar
But at some point, it starts doing something else (as you can see below).
It starts examining my PATHEXT environment variable.
To better highlight what I happened, I did:
Trace-Command -Name CommandDiscovery -Expression { C:\test.ps1 } -PSHost Trace-Command -Name CommandDiscovery -Expression { C:\test.ps1. } -PSHost
In the first case, the CommandDiscovery correctly found that c:\test.ps1 is a script and invoked it.
In the second case, the CommandDiscovery found that c:\test.ps1. is an application and started looking for an application that can handle this extension.
If it finds a MRU list under HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\OpenWithList (if you’ve ever double-clicked on .ps1 file), it will use it.
If it’s not the case, it starts looking at this registry key HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\OpenWithProgids
But when it doesn’t find the MRU list or the OpenWithProgids
It writes the OpenWithProgids value in the user hive and set it to Microsoft.PowerShellScript.1
(I’ll over simplify it) It then starts looking for any application listed under this key HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications to find out if .ps1 is listed in their “capabilities”
Then under the same key but under the user hive: HKEY_CURRENT_USER\Software\RegisteredApplications
It then reaches back again what’s in the machine hive to “open” what it detected as a “Microsoft.PowerShellScript.1”
This is absolutely sick! Very clever, thxs!
Cool trick, apparently only works for absolute paths, no relative paths..