我想要做的事情很简单,我想创建一个文件来预先配置我最喜欢的视频播放器的设置。我已经完成了大部分准备工作,但设置文件关联却让我很为难。
便携式安装程序不会添加文件关联,如果我在视频播放器设置中尝试,它将引用基本应用程序而不是便携式启动器。
所以现在我尝试制作一个简单的工具来配置文件类型关联而不使用绝对路径,因为就像我说的,这个程序是可移植的,如果程序移动,路径就会中断。如果我避免使用绝对路径,那么我可以将这个工具(我们称之为“ Configure Filetype Associations.exe
”)放在与“ ”相同的文件夹中PotPlayerPortable.exe
,然后以这种方式进行配置。
这是我到目前为止尝试过的命令,如果我不能弄清楚,我会再试一次啊哈但是我看到的所有例子都使用了绝对路径,就像我说的,这是一个问题:
assoc .mkv=PotPlayerPortable.MKV
ftype PotPlayerPortable.MKV="PotPlayerPortable.exe" "%1"
我希望我的批处理文件能够根据位置自动检测完整路径,但它不起作用。
编辑1:所以我今天确实取得了很大进展。我决定,如果我不能使用相对路径,那么我会使用啊哈捕获并将工作目录存储在变量中,并使用该变量创建绝对路径。
问题是,还有第三方需要担心,此外ASSOC
,FTYPE
我的意思是,这里有一个名为Progid
found 的密钥:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\UserChoice
并且在Windows 7的它会覆盖ASSOC
和FTYPE
。更糟糕的是,该密钥受到保护。现在我不得不问,我如何才能覆盖注册表项上的保护 LOL 听起来很恶意。我知道我可以进入权限,但我正试图在这里自动化一切,制作一个简单的程序来配置文件扩展名不应该这么难,我想要向后兼容Windows 7的,Windows Vista可以吸吮我的肥乳头……
编辑2:REGINI
命令看起来很有希望,现在正在调查......
编辑3:看起来这个可能会起作用,computername参数是不可能的,因为它会破坏可移植性,但如果我能弄清楚语法,regini -h应该可以工作。看尼克·凯奇的电影,我会测试一下。应该是这样的:
regini -h hivefile hiveroot HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\UserChoice [1 5 7 20 21]
一旦权限被编辑,我就可以编辑或删除密钥,仅仅注册 1 个扩展就只需 4 个步骤 :/
编辑4:因此,编辑权限以修改密钥比我想象的要难得多。我可以使用 SetACL 来应用权限,但不能删除拒绝条目,当然也不能覆盖拒绝条目。幸运的是,我只是被禁止修改密钥,我确实有删除权限,因此即使没有 SetACL,删除并重新创建密钥的简单脚本也应该可以解决问题。我可能要到早上才会尝试这个,但我想我终于找到了解决方案。
编辑5:我基本上已经弄清楚了,但如果不删除“拒绝”条目,我仍然无法继续。
这是我目前所拥有的:
assoc .mpg=PotPlayerPortable.mpg
ftype PotPlayerPortable.mpg="PotPlayerPortable.exe" "%1"
reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mpg\UserChoice /f
reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mpg\UserChoice /v Progid /t REG_SZ /d Applications\PotPlayerPortable.exe /f
pause
我怀疑问题并REG.exe
没有得到解决,尽管命令是。
答案1
好吧,我搞明白了,实际上我根本不需要任何绝对路径!按照这些说明创建您自己的小程序,为 1 个或多个程序注册扩展。这是一个示例代码,我将在下面解释:
FLV文件
Pushd "%~dp0"
assoc .flv=PotPlayerPortable.FLV
ftype PotPlayerPortable.FLV="PotPlayerPortable.exe" "%1"
regedit /s FLV.reg
reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\UserChoice /v Progid /t REG_SZ /d Applications\PotPlayerPortable.exe /f
注意:我知道您的想法,但是由于 Win7 中的拒绝权限条目,regedit 这次比 reg 效果更好。
FLV文件
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.flv\UserChoice]
此批处理文件必须以管理员身份运行。为每个要更改的扩展名创建一个新文件,为澄清起见,此脚本当前已配置为注册扩展名 .FLV,以便使用名为 PotPlayerPortable.exe 的程序运行,该程序必须位于当前目录中。
现在我们有两种方法可以继续,一种方法是更改所有扩展名,另一种方法仅在某个 .ini 文件将某个选项指定为 1 时才更改扩展名,例如,我们可以使用 FLV=1。我将解释这种方法,因为它更有用。创建一个以 start /w 命令开头的主批处理文件,这将允许我们运行 AutoHotkey 脚本,我们将使用 Ahk2Exe 将其转换为 exe,该脚本可以在 AutoHotkey v2.0.2 安装文件夹中找到。/w 参数意味着我们的主批处理文件将等到我们的 AutoHotkey 程序关闭后再继续执行下一个命令,与 AutoHotkey 的 RunWait 命令不同,它不需要看到窗口即可正确执行此操作。此 AHK 脚本将读取我们的 .ini 文件,并根据在那里检测到的设置,我们将使用 if/else 命令来分配扩展名或不分配。除“1”之外的任何设置都将失败。差不多就是这样了,为了将所有文件打包到一个程序中,我们可以在主批处理文件上使用 Bat to Exe Creator,为其添加一个好图标,添加 vista 管理员访问权限,选择不可见的应用程序,设置退出时删除的临时文件,在包含部分添加文件,这样我们就只剩下一个可以快速运行并在之后清理的程序了。如果希望可自定义,请将 .ini 文件放在 .exe 之外。很简单,对吧?我希望代码易于理解。我建议您继续使用 AutoHotkey 和 Bat to Exe Creator,它们都是非常有用的程序。我喜欢一个只做需要做的事情而不做其他事情的程序,这就是为什么我实际上使用的是 Bat to Exe Creator 的旧版本。以下是一些示例代码:
主批处理文件.exe
timeout 5
start "" /w AHKScript.exe
执行AHK脚本
A_FLV := IniRead("Associations.ini", "Settings", "FLV")
if A_FLV = 1{
Run("FLV.vbs")
sleep "50"
}
协会.ini
[Settings]
FLV=1
下载:
自动热键: https://www.autohotkey.com/
Bat 至 Exe Creator: https://www.mediafire.com/file/5muq1k44nipshgy/Bat_to_Exe_Converter.exe