How can I associate a file type with a powershell script?

后端 未结 5 1142
名媛妹妹
名媛妹妹 2021-02-14 10:10

I have a very powershell script that works perfectly and does:

Param(
  [string]$fileName
) 

echo \"Woo I opened $fileName\"

When I run it on

相关标签:
5条回答
  • 2021-02-14 10:21

    Here's my remix of @Matthieu 's great remix of @Ansgar Weichar's great answer.

    Matthieu's is set up for executables, and doesn't work for powershell scripts for the same reasons the OP describes.

    Function Set-FileAssociationToPowerShellScript($extension, $pathToScript) {
    
        # first create a filetype
        $filetype = cmd /c "assoc $extension 2>NUL"
        if ($filetype) {
            # Association already exists: override it
            $filetype = $filetype.Split('=')[1]
            Write-Output "Using filetype $filetype"
        }
        else {
            # Name doesn't exist: create it
            # ".log.1" becomes "log1file"
            $filetype = "$($extension.Replace('.', ''))file"
            Write-Output "Creating filetype $filetype ($extension)"
            cmd /c "assoc $extension=$filetype"
        }
        Write-Output "Associating filetype $filetype ($extension) with $pathToScript.."
        cmd /c "ftype $filetype=powershell.exe -File `"$pathToScript`" `"%1`""
    }
    
    0 讨论(0)
  • 2021-02-14 10:31

    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 :)

    0 讨论(0)
  • 2021-02-14 10:32

    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

    1. The powershell script
    2. The target filename

    To do this

    1. Launch Regedit.exe. //disclaimer: you are editing Windows registry. Here be tigers.
    2. Go to HKEY_CLASSES_ROOT (admin access, for all users) or HKEY_CURRENT_USER\SOFTWARE\Classes
    3. Create a key named .<extension>, e.g. if you want to associate *.zbs - create a key .zbs
    4. Set it's (default) value to something like zbsfile -- this is a reference linking your extension to a filetype.
    5. Create a key called zbsfile - this is your filetype
    6. Set (default) value to something readable, e.g. "This file is ZBS."
    7. Underneath create a tree of keys (examples are all around):

    zbsfile shell open command

    1. 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...

    0 讨论(0)
  • 2021-02-14 10:35

    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
    
    0 讨论(0)
  • 2021-02-14 10:40

    Here is a concrete answer tested under Windows 7 (but should work under 10 too). Open an administrative command shell and execute the following two lines once:

    > assoc .ps1=Microsoft.PowerShellScript.1
    > ftype Microsoft.PowerShellScript.1=%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -File "%1"
    

    Now PS1-files are executed by PowerShell 1.0 and not opened by Notepad anymore when double-clicked in the Explorer.

    0 讨论(0)
提交回复
热议问题