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

16

我有一个非常完美的PowerShell脚本,它可以:

Param(
  [string]$fileName
) 

echo "Woo I opened $fileName"

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


my-script.ps1 .\somefile
返回:
Woo I opened somefile
我想把my-script.ps1与特定的文件类型关联起来。我正在尝试通过“打开方式”来实现这一点。但是:
  • Windows不将PowerShell脚本视为“程序”(尽管它将CMD和批处理脚本视为“程序”)

enter image description here

  • 当我选择“所有文件”,然后选择我的PowerShell脚本时,Windows会显示此消息

enter image description here

如何将文件类型与PowerShell脚本关联起来?


这个问题现在已经有超过2500次的浏览量了 - 我想知道@rich-turner是否想要打扰Windows团队,让他们将ps1combat一起添加到列表中。 - mikemaccana
1
不幸的是,尽管这被标记为Windows-10,但cmd选项已不再起作用。我在苦苦挣扎很久后才意识到这一点。只有XML路由可以使用。我不确定Windows发行版的截止日期,但参考资料在这里(前两个句子):https://learn.microsoft.com/en-us/archive/blogs/hewagen/making-file-type-associations-enterprise-ready - SaintFrag
6个回答

21

使用适当的工具完成工作:

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

3
您是否知道assocftype会影响当前用户还是本地机器?我不记得了,但我记得这个问题曾经让我吃过亏。 - Bacon Bits
1
我没有检查非管理员用户,但对于具有管理员权限的用户,这些命令会修改HKLM\Software\Classes。 - Ansgar Wiechers

4
我认为你无法通过Windows UI完成这个操作。
这里的目标是将类型与powershell.exe关联起来,其参数将是:
1. powershell脚本 2. 目标文件名
要做到这一点:
1. 启动Regedit.exe。//免责声明:您正在编辑Windows注册表。此处存在风险。 2. 转到HKEY_CLASSES_ROOT(管理员访问,适用于所有用户)或HKEY_CURRENT_USER\SOFTWARE\Classes 3. 创建一个名为.的键,例如,如果您想关联*.zbs - 创建一个名为.zbs的键 4. 将它的(默认)值设置为类似于zbsfile的内容 - 这是将您的扩展名与文件类型链接起来的引用。 5. 创建一个名为zbsfile的键 - 这是您的文件类型 6. 将(默认)值设置为可读的内容,例如“This file is ZBS。” 7. 在下面创建一个键树(示例都在周围):
zbsfile shell open command
8. 在command下,将(默认)值设置为例如powershell.exe -File "C:\path\to your\file.ps1" "%1",其中%1表示用户单击的文件。
那应该可以了。
编辑: 或者(疯狂的想法),创建一个批处理文件,只需执行powershell.exe -File "C:\path\to your\file.ps1" "%%1"并在Windows UI中选择它...

我需要创建一个与没有扩展名的文件相关联的关联(以正确处理启动它)。这可能吗? - mikemaccana
看起来是这样的:http://www.itprotoday.com/management-mobility/how-do-i-create-default-association-files-no-extension - mikemaccana

4

对于像我这样寻找通用文件类型关联的人,最终我使用了以下函数:

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的答案中正确引用方面遇到了困难,但最终解决了:)


你需要将这个 < cmd /c 'assoc $ext=$name' > 更新为 < cmd /c "assoc $ext=$name" >,然后它就能正常工作了。 :D - Max Barrass
@MaxBarrass 哈哈哈哈哈 :)) - Matthieu

2

以下是在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执行,而不再是由记事本打开。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接