如何将Wine中的所有文件类型与其相应的本机应用程序相关联?


8

对于单个文件类型,这很容易完成,如如何在Wine中将文件类型与本机应用程序关联?,方法是.reg为所需的文件类型创建一个。但这仅适用于AVI。我使用了一些酒类应用程序(uTorrent,Soulseek,Eudora等),它们可以启动各种文件。例如,电子邮件附件可以是JPG,DOC,PDF,PPS ...这不可能(也不是理想的)来跟踪电子邮件中可能收到的所有文件类型或洪流下载的文件类型。

因此,我需要一个更通用,更广泛的解决方案。我需要文件关联以兑现当前配置的任何本机应用程序。我希望对系统中配置的所有文件类型都执行此操作。

我已经想出了使解决方案通用的方法。只需将.regfor中启动的应用替换为winebrowser,如下所示:

[HKEY_CLASSES_ROOT\.pdf]
@="PDFfile"
"Content Type"="application/pdf"
[HKEY_CLASSES_ROOT\PDFfile\Shell\Open\command]
@="C:\\windows\\system32\\winebrowser.exe \"%1\""

香港专业教育学院测试过,它可以正常工作。由于winebrowser xdg-open用作后端,并将Windows路径转换为Unix路径,因此启动了正确的(Linux)应用程序。

因此,我需要一个用于Wine注册表的“批处理”更新程序,这种wine-update-associations脚本可以在安装新应用程序时立即运行。也许一个工具可以:

  • 列出我的系统中与默认的已安装应用程序相关联的所有Mime Types类型
  • 提取所有需要的信息(glob,mime类型等)
  • 以上述格式生成.REG文件

棘手的部分是:我搜索了很多,以查找有关在Ubuntu 10.10及更高版本中如何完成关联的信息,至少可以说文档稀缺且令人困惑。Freedesktop.org没有完整的规范,甚至Gnome文档也已过时。到目前为止,我已经收集了4个包含关联信息的文件,但对于要使用哪个(或为什么)或如何使用它们来生成.reg文件一无所知:

~/.local/share/applications/mimeapps.list
~/.local/share/applications/miminfo.cache
/usr/share/applications/miminfo.cache
/etc/gnome/defaults.list

任何帮助,脚本或解释将不胜感激!

谢谢!

Answers:


2

几年后,我制作了一个小的实用程序,可以扫描MIME数据库(系统和用户),并在Windows注册表中注册所有已知的本机mime类型。

xdg-open如果存在用于该mime类型的默认(本机)应用程序,则它用于打开文件,否则用于packagekit搜索可以处理该文件的包(就像Nautilus所做的一样)。因此,我不再需要仅注册具有已安装的本机应用程序的扩展程序。但是,该脚本的早期版本仅过滤此类类型。使之成为可能的代码片段是:

perl -e '
    use strict; use warnings;
    use File::MimeInfo::Magic; use File::MimeInfo::Applications;
    while (my $line = <STDIN>) {
      chomp($line);
      my ($ext, $mime) = (split/\t/, $line);
      my ($def, @apps) = mime_applications_all($mime);
      print "$line\n" if ($def || @apps)
    }'

默认情况下,我的脚本仅在Windows注册表中注册没有处理程序的本机类型,但它也可以覆盖此类关联(例如,在本机查看器而不是默认的Gecko wine浏览器中打开jpeg文件)。即使它们在Windows中没有处理程序,它也可以忽略某些扩展。

它尽力做到对winemenubuilder友好,这意味着它创建的所有关联都不会被winemenubuilder发布为本地关联(或x-wine-extension mimetypes),这将是丑陋的并可能导致循环。这非常棘手,而且还不完美,特别是在使用大小写混合的情况下(例如.C和.c)

就是说,我希望这个脚本对每个人都有帮助:

https://github.com/MestreLion/wine-tools/blob/master/wine-import-extensions

欢迎改进!


您的脚本说成功了,但是酒对我来说没有任何变化。没什么大问题,我在wine应用程序Everything本身中找到了另一个解决方法,但我只是想通知您
phil294

1

编辑:

关于此的一个葡萄酒错误 -比错误更重要的是改进。关键是要有ShellExecutecall xdg-open,如果找不到,请寻找gnome和kde默认值。您应该能够应用该补丁并最终拥有魔力:-)。此解决方案更干净,因为它不需要弄乱注册表。

为了更完整,这里是如何从源代码修补和编译葡萄酒

结束编辑

我使用下面的脚本更新wine注册表,以添加常见文件类型的列表。
您可以扩展列表以添加更多类型。
它会/usr/bin/gnome-opengstart.exe文件中使用,因此它不适用于非gnome桌面

放入conf_wine.sh

#!/bin/bash

SRC=~
WINE=~/.wine
REG=$WINE/system.reg
GSTART=gstart.exe
GSTART_TARGET=$WINE/drive_c
EXE_TARGET=$WINE/drive_c/windows
FNKEY=/tmp/"key"$(date +%F_%H-%M-%S)".reg"

[ -e $FNKEY ] && { echo "temporary key file exists..try again"; exit 1; }

echo "copying gstart.exe"
cp $SRC/$GSTART $GSTART_TARGET
chmod +x $GSTART_TARGET

echo "backing up the registry"
cp $REG $REG.$(date +%F_%H-%M-%S).old

echo "setting new wine registry keys"
for i in http doc docx ppt pptx xls xlsx odt ods xml txt pdf odt svg zip ; do {
    echo "setting $i"
key='[HKEY_CLASSES_ROOT\.'$i']
@="'$i'file"
"Content Type"="application/'$i'"
[HKEY_CLASSES_ROOT\'$i'file\Shell\Open\command]
@="C:\\gstart.exe \"%1\""'
    echo "$key" > $FNKEY
    regedit $FNKEY
}
done

echo "done"

gstart.exe是一个bash script..and是桥梁的两个世界:

#!/bin/bash

OPEN_HANDLER=/usr/bin/gnome-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG

# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR

# finally open the file
$OPEN_HANDLER "$RESULT"

笔记:

  1. 复制gstart.exe在当前工作目录中运行之前 conf_wine.sh,因为这将它复制到.wine文件夹中。
  2. 文件夹位置可以更改,例如gstart.exe不必坐在中c:\
  3. 没有魔术:必须手动添加新类型。您可以对其进行改进,以读取Linux文件(mimeapps.list,..),并在需要时更新wine注册表。
  4. 测试至少在wine1.4中可以工作。

Wine常见问题解答:如何在Wine中将本机程序与文件类型相关联?


+1的努力,但这很难解决我的问题。首先,使用gnome-openover 几乎没有意义xdg-open,我已经在问题中提到过了,并且更具可移植性。其次,对一些文件扩展名进行硬编码对我来说是不够的:正如我所说,“我需要文件关联来尊重当前配置的任何本机应用程序。我希望对系统中配置的所有文件类型都执行此操作。” 而且我知道这很棘手。这是您对我感兴趣的注释3中提到的“魔术”;)
MestreLion,2012年

我想我第一次阅读您的问题太快了。我看到您使用的是xdg-open,我将在脚本中对其进行更改。关于魔术:一种方法是读取而不是读取mime文件中的所有项目。但是随后每次更新系统时都必须运行它,因为可能已添加了新的扩展名。但这并不是每天都发生。
rosch 2012年

甚至残酷地为注册表更新设置了cronjob。仅在哑剧已更新的情况下才修改注册表。
rosch 2012年

棘手的部分不是何时更新注册表,而是如何(或更准确地说,针对哪个文件扩展名更新)?我不知道如何一致地解析mime数据库,以检索具有默认的已安装应用程序关联的所有扩展。或者,如您所说:如何读取mime文件中的所有项目?我的某些MIME类型mimeapps.lst尚未在此处安装,有些还指向了Wine应用(这会导致无限循环)
MestreLion 2012年

抱歉,我的第一条评论中的英文错误,我对其进行了编辑,有点弄乱了。
rosch 2012年

0

我到处收集了Info信息,并发现以下内容可以正常工作:

我创建了一个名为〜/ .wine / drive_c / gstart.exe的文件

具有以下内容:

#!/bin/bash
OPEN_HANDLER=/usr/bin/xdg-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG
# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR
# finally open the file
$OPEN_HANDLER "$RESULT"

然后:在我的〜/ bin中创建一个名为linuxnative.reg的文件

具有以下内容:

REGEDIT4
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.rtf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.odt]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.pdf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.tif]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.docx]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.jpg]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\linuxnative]
[HKEY_CLASSES_ROOT\linuxnative\shell]
[HKEY_CLASSES_ROOT\linuxnative\shell\open]
[HKEY_CLASSES_ROOT\linuxnative\shell\open\command]
@="c:\\gstart.exe \"%1\""

然后你做一个

regedit linuxnative.reg

希望这可以帮助。


感谢您的帮助!但是一些著名扩展的硬编码列表不能解决我的问题。另外,“您从各地收集的信息”似乎与我和罗什已经发布的信息相同,包括他gstart.exe脚本的复制和粘贴。
MestreLion
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.