52

I've just recently reinstalled Windows and in setting up my environment I've noticed that all my associations for the various programming languages I edit in Notepad++ have gone (naturally).

I am thinking for the future, wouldn't it be grand to have some kind of batch file that could automatically associate a selection of file extensions with N++ at the click of a button, rather than having to wait until I encounter all these extensions then go through the rigmarole of navigating to the N++ exe etc.

I can't do this with the Default Programs utility that comes with Windows 7, because it only works with extensions that have been 'encountered'.

So is it possible to programatically associate file extensions with application on Windows?

deed02392
  • 2,982
  • 6
  • 26
  • 36

3 Answers3

71

Use Ftype & Assoc to fix this (and it is scriptable).

Use Assoc to get the filetype

>Assoc .txt

gives you:

.txt = txtfile

Then

>Ftype txtfile=C:\Program Files (x86)\Notepad++\notepad++.exe %1

Once you know the file type you can use Ftype to associate it with an action.

This would work for .php files (just plop them in a batch file)

Assoc .php=phpfile
Ftype phpfile="C:\Program Files (x86)\Notepad++\notepad++.exe" %1

And you can copy these lines to add other text-based files as you would like.

uSlackr
  • 8,955
  • 31
  • 48
  • 2
    Interesting, when I do `>assoc .php` it says it has no file association? It seems what is set up when you specify a default program to open a file type is not 'registered' in this way. Why might that be? – deed02392 Mar 31 '12 at 18:35
  • 23
    +1 for two command line tools that i didn't know existed. – Ian Boyd Mar 31 '12 at 19:41
  • 2
    This solution makes text files open up in notepad++ and not the previously assigned program (notepad). It won't make notepad++ open when you click on a new, unregistered, file extension (eg. pl, py or c) like the submitter asked. – Richard Apr 01 '12 at 09:34
  • @Richard I just re-read the post an I don't see where he asks that. – uSlackr Apr 01 '12 at 19:52
  • 2
    @deed02392 you can add a new association with assoc 'Assoc .php=phpfile' should work – uSlackr Apr 01 '12 at 19:53
  • 1
    The bit "some kind of batch file that could automatically associate a selection of file extensions with N++" - although it could have been me misunderstanding it! – Richard Apr 01 '12 at 21:51
  • You understood correctly Richard, the solution should automate the recognition of previously unencountered file extensions and associate notepad++ as the open handler for these files. – deed02392 Apr 03 '12 at 10:54
  • 2
    The intent of my answer was to show you how to use assoc & ftype, not to write the batch file for you. But I'll play along – uSlackr Apr 03 '12 at 19:56
  • +1 Did not know these commands. Found this very useful!! – Angshuman Agarwal Jun 20 '12 at 16:16
  • 1
    For some reason, after a while all my notepad++ associations switch to "Office XML Handler". However if I do an Assoc on any of those extensions, it always gives "Notepad++_file" and ftype says that Notepad++_file is associated with "MSOXMLED.EXE" somehow. Anyways this answer helped me set association of "Notepad++_file" back to notepad++.exe without going through each and every file extension. – Waqas Ilyas Mar 01 '18 at 18:13
  • Trying this answer on an .mkv, assoc doesn't even see the file extension when run, unlike 'Default Programs Editor' which can pick up on it. There must be some other mechanism at play in 2021 that can add additional entries. – Ryan Leach Jan 22 '21 at 07:13
  • You can add the association even if it doesn't exist. `assoc .mkv=mkvfile` Ftype mkvfile="C:\Program Files..." That said, Windows store apps may not use this setting and to you point, this answer is from way back. There my be a different solution for modern apps. That would be the topic for a different question – uSlackr Jan 23 '21 at 14:18
8

Here's a script that worked for me on Windows 10

$exts=@("txt","log","csproj","sql","xml","flobble")
echo "## setting up file associations"
foreach ($ext in $exts){
    $extfile=$ext+"file"
    $dotext="." + $ext
    cmd /c assoc $dotext=$extfile
    cmd /c "ftype $extfile=""C:\Program Files (x86)\Notepad++\notepad++.exe"" ""%1"""
    echo ""
}
  • Needs to be run in an administrator (elevated) PowerShell window.
  • Explorer immediately refreshed and showed new file icons.

https://gist.github.com/timabell/bc90e0808ec1cda173ca09225a16e194

Thanks to the other answers for the information I needed to make this work.

KERR
  • 557
  • 6
  • 8
Tim Abell
  • 376
  • 1
  • 6
  • 17
4

At the minimum, you need to create one registry key which gives notepad++ an ID and path and then one for each extension you wish to register to use it.

To create the ID and path (check the path points to the correct location):

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\notepad_pp]
@=""

[HKEY_CLASSES_ROOT\notepad_pp\shell]

[HKEY_CLASSES_ROOT\notepad_pp\shell\open]

[HKEY_CLASSES_ROOT\notepad_pp\shell\open\command]
@="\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\" \"%1\""

and then keep repeating the next bit, one for each extension (in this example, .pl is for Perl):

[HKEY_CLASSES_ROOT\.pl]
@="notepad_pp"

Save this file with the extension .reg and you should now be able to re-associate all the extensions just by double-clicking on this file and confirming you want to import the entries into the registry.

Richard
  • 5,831
  • 9
  • 44
  • 73
  • 1
    Interesting, I've been looking and it seems what Windows 7 does when you set a program to load from is create an entry in HKCR\ext_auto_file\shell\open\command with a value of "C:\Program Files\Notepad++\notepad++.exe" "%1". Where were you basing yours from? – deed02392 Mar 31 '12 at 18:26
  • It's basically the same, just with ext_auto_file renamed to something slightly more meaningful and multiple file extensions pointing to one single entry. – Richard Mar 31 '12 at 22:14
  • Hey, could you elaborate the above as a full valid reg file? – eri0o Jan 26 '22 at 10:31