tags:

views:

57

answers:

1

I have a portable development tool that I want to use on other PCs. I'd like to set a file association so that clicking a file opens the tool. Then, when I'm finished, I want to undo or reset the file association on that PC.

Is there a way to do this? Possibly from a batch file?

+1  A: 

Well, you can use the ftype and assoc commands to create or delete file type associations:

ASSOC .foo=FooFile
FTYPE FooFile=X:\Foo\foo.exe %1 %*

You can delete them later with

FTYPE FooFile=
ASSOC .foo=

EDIT: I've got a try now with something that enables you to re-set the association back to its default. I put it in my Subversion repo. In its current stage it generates two new batch files: set.cmd and reset.cmd; one of which sets a new association, the other reverses it. Rolling the set.cmd into the actual batch shouldn't be too difficult but it would have made testing here a hell, so I'll leave that as an exercise.

Code follows, it should be commented enough, hopefully.

@echo off
setlocal enableextensions enabledelayedexpansion
rem Debug flag. Generates a little more output; un-set if undesired
set DEBUG=1

rem Parse arguments and help
if [%1]==[] goto Usage
if [%2]==[] goto Usage

rem Find out whether the association is taken
for /f "usebackq tokens=2* delims==" %%x in (`assoc .%1 2^>nul`) do set assoc_old=%%x
if defined DEBUG (
    if defined assoc_old (echo Association already defined: [%assoc_old%]) else (echo Association not yet taken)
)

rem Find a new, unused association
rem Note that we assume that we find one, eventually. This isn't guaranteed, but we'll ignore that for the moment
rem Otherwise this loop might run forever
:loop
    set assoc_new=My.%1.%RANDOM%
    if defined DEBUG echo Trying new association (%assoc_new%)
    assoc .%1 >nul 2>nul
    if errorlevel 1 (
        set assoc_new=
        if defined DEBUG echo Didn't work out
    ) else (
        if defined DEBUG echo Found one! \o/
    )
if not defined assoc_new goto loop

if defined DEBUG echo Writing reset batch file
echo @echo off>reset.cmd
echo assoc .%1=%assoc_old%>>reset.cmd
echo ftype %assoc_new%=>>reset.cmd

if defined DEBUG echo Writing setting batch file
echo @echo off>set.cmd
echo assoc .%1=%assoc_new%>>set.cmd
echo ftype %assoc_new%=%2 %%1>>set.cmd

goto :eof

:Usage
echo.Usage
echo.  %~nx0 type command
echo.
echo.  type      is the file type to override, such as docx or txt.
echo.            No dot before it is necessary.
echo.  command   is the command to perform on that file.
echo.            %%1 is automatically appended at the end.
echo.            If the command includes spaces, surround it with quotes.
echo.
echo.Example
echo.  %~nx0 txt notepad

exit /b 1
Joey
This does do the association, but doesn't solve the problem of resetting the association back to the previous app, but I ticked you anyway as your solution is working well enough for me.
soupagain
@soup: Ah, sorry. I didn't read your question as if there was a previous application associated to it. It might be possible to first query the previous association and write another batch file dynamically that restores it. I'll try whether it's easy enough; just hold on :-)
Joey
@soup: Edit is up; got a batch file to test. Seemingly this doesn't work as a non-admin user, though; this greatly reduces its value, sadly.
Joey
@johannes: Been testing this and it works perfectly! Great stuff, thanks.
soupagain