【问题标题】:How can I associate a file type with a powershell script?如何将文件类型与 powershell 脚本相关联?
【发布时间】:2021-03-28 02:11:19
【问题描述】:

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

Param(
  [string]$fileName
) 

echo "Woo I opened $fileName"

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

my-script.ps1 .\somefile

返回:

Woo I opened somefile

我想将my-script.ps1 与特定文件类型相关联。我正在尝试通过“打开方式”执行此操作:

  • Windows 不将 Powershell 脚本包含为“程序”(尽管它将 CMD 和批处理脚本视为“程序”)

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

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

【问题讨论】:

  • 这个问题现在已经有超过 2500 次浏览 - 我想知道 @rich-turner 是否觉得像在窃听 Windows 团队将 ps1 添加到 combat 旁边的列表中。 ??????

标签: powershell windows-10


【解决方案1】:

为工作使用适当的工具:

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

【讨论】:

  • 您是否知道assocftype 是否影响当前用户或本地计算机?我不记得了,但我记得那次咬我。
  • 我没有检查非管理员用户,但是对于具有管理员权限的用户,命令修改 HKLM\Software\Classes。
【解决方案2】:

我不认为你可以通过 Windows UI 做到这一点。

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

  1. powershell 脚本
  2. 目标文件名

这样做

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

zbsfile shell open command

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

应该可以的。

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

【讨论】:

【解决方案3】:

对于像我这样寻找一般文件类型关联的人,我最终使用了这个功能:

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 时遇到了困难,但最终还是做对了 :)

【讨论】:

    【解决方案4】:

    这是我对@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`""
    }
    

    【讨论】:

      【解决方案5】:

      这是在 Windows 7 下测试的具体答案(但也应该在 10 下工作)。打开一个管理命令 shell 并执行以下两行:

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

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

      【讨论】:

        【解决方案6】:

        对于获取关联应用程序,我使用 [!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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-15
          • 1970-01-01
          • 2022-01-11
          • 2011-11-03
          • 1970-01-01
          • 2012-03-10
          相关资源
          最近更新 更多