How can I associate a file type with a powershell script?
Use the proper tools for the job:
cmd /c assoc .fob=foobarfile
cmd /c ftype foobarfile=powershell.exe -File `"C:\path\to\your.ps1`" `"%1`"
Note that both assoc
and ftype
are CMD-builtins, so you need to run them via cmd /c
from PowerShell.
For files without extension use this association:
cmd /c assoc .=foobarfile
I don't think you can do it through Windows UI.
The goal here is to associate a type with powershell.exe, arguments to which will be
- The powershell script
- The target filename
To do this
- Launch
Regedit.exe
. //disclaimer: you are editing Windows registry. Here be tigers. - Go to HKEY_CLASSES_ROOT (admin access, for all users) or HKEY_CURRENT_USER\SOFTWARE\Classes
- Create a key named
.<extension>
, e.g. if you want to associate *.zbs - create a key.zbs
- Set it's (default) value to something like
zbsfile
-- this is a reference linking your extension to a filetype. - Create a key called
zbsfile
- this is your filetype - Set (default) value to something readable, e.g. "This file is ZBS."
- Underneath create a tree of keys (examples are all around):
zbsfile
shell
open
command
- Under
command
, set (default) value to e.g.powershell.exe -File "C:\path\to your\file.ps1" "%1"
where %1 means the file user clicked
That should work.
EDIT:
or (crazy idea), create a bat file doing just powershell.exe -File "C:\path\to your\file.ps1" "%%1"
and select it in Windows UI...
For those like me who got here looking for general file types associations, I ended up using this function:
Function Create-Association($ext, $exe) {
$name = cmd /c "assoc $ext 2>NUL"
if ($name) { # Association already exists: override it
$name = $name.Split('=')[1]
} else { # Name doesn't exist: create it
$name = "$($ext.Replace('.',''))file" # ".log.1" becomes "log1file"
cmd /c 'assoc $ext=$name'
}
cmd /c "ftype $name=`"$exe`" `"%1`""
}
I struggled with proper quoting from @Ansgar Wiechers's answer but finally got it right :)