如何将文件类型与powershell脚本相关联?

时间:2018-01-16 11:42:46

标签: powershell windows-10

我有一个非常强大的PowerShell脚本,可以完美运行:

Param(
  [string]$fileName
) 

echo "Woo I opened $fileName"

当我在命令行上运行它时,它可以工作:

my-script.ps1 .\somefile

返回:

Woo I opened somefile

我想将my-script.ps1与特定文件类型相关联。我试图通过' Open With'但是:

  • Windows不包含Powershell脚本作为'程序' (虽然它将CMD和批处理脚本视为'程序')

enter image description here

  • 当我选择“所有文件”时相反,并选择我的powershell脚本,Windows显示此消息

enter image description here

如何将文件类型与Powershell脚本相关联?

6 个答案:

答案 0 :(得分:4)

使用适当的工具:

cmd /c assoc .fob=foobarfile
cmd /c ftype foobarfile=powershell.exe -File `"C:\path\to\your.ps1`" `"%1`"

请注意,assocftype都是CMD内置的,因此您需要通过PowerShell中的cmd /c运行它们。

对于没有扩展名的文件,请使用此关联:

cmd /c assoc .=foobarfile

答案 1 :(得分:1)

我认为你不能通过Windows用户界面做到这一点。

这里的目标是将一个类型与powershell.exe相关联,其参数将是

  1. powershell脚本
  2. 目标文件名
  3. 要做到这一点

    1. 启动Regedit.exe。 //免责声明:您正在编辑Windows注册表。 这里是老虎。
    2. 转到HKEY_CLASSES_ROOT(适用于所有用户的管理员权限)或HKEY_CURRENT_USER \ SOFTWARE \ Classes
    3. 创建名为.<extension>的密钥,例如如果你想关联* .zbs - 创建一个键.zbs
    4. 将其(默认)值设置为zbsfile - 这是将您的扩展名与文件类型相关联的引用。
    5. 创建一个名为zbsfile的密钥 - 这是您的文件类型
    6. 将(默认)值设置为可读的内容,例如“这个文件是ZBS。”
    7. 在下面创建一个键树(示例遍布):
    8. zbsfile shell open command

      1. command下,将(默认)值设置为例如
        powershell.exe -File "C:\path\to your\file.ps1" "%1"
        其中%1表示用户单击的文件
      2. 这应该有效。

        编辑: 或者(疯狂的想法),创建一个只做powershell.exe -File "C:\path\to your\file.ps1" "%%1"的bat文件并在Windows UI中选择它...

答案 2 :(得分:1)

对于那些像我一样在这里寻找常规文件类型关联的人,我最终使用了此功能:

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`""
}

我一直在努力使用@Ansgar Wiechers's answer中的正确报价,但最终弄对了:)

答案 3 :(得分:1)

这是我对@Matthieu的完美混音,对@Ansgar Weichar的很好的答案。

Matthieu是为可执行文件设置的,出于与OP描述的相同原因,它们不适用于Powershell脚本。

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`""
}

答案 4 :(得分:0)

这是在 Windows 7 下测试的具体答案(但也应在 10 下运行)。打开管理命令外壳并执行以下两行:

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

现在 PS1 文件由 PowerShell 1.0 执行,在资源管理器中双击时不再由记事本打开。

答案 5 :(得分:0)

对于获取关联应用程序,我使用 [!magic] :) :

Set-Alias fa Get-AssocApp

#Get application by file extension Proto1
function Get-AssocApp ([string] $FileType) { 
        ((cmd /c echo ((cmd /c ftype  ( (cmd /c assoc $FileType) -replace "(.*=)*" ,"")) -replace "(.*=)","")).Replace('"','') -replace "\s%+.*$" ,"")

}

出:

PS C:\Users\user> fa .txt
C:\WINDOWS\system32\NOTEPAD.EXE
PS C:\Users\user> fa .pdf
C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe
PS C:\Users\user> fa .js
C:\Windows\System32\WScript.exe