在 Wine 下运行的这个 Windows 程序是否无法识别其参数的绝对路径名?

在 Wine 下运行的这个 Windows 程序是否无法识别其参数的绝对路径名?

我在用PDFXC查看器在 Ubuntu 16.04 下的 wine-3.1 中。

当我将 pdf 文件指定为 的参数时PDFXCview.exe,pdf 文件的绝对路径名无法PDFXCview.exe找到该 pdf 文件,而 pdf 文件的相对路径名可以找到该 pdf 文件。

例如:

wine /path/to/PDFXCView.exe my.pdf

my.pdf在 中 打开PDFXCView.exe,而

wine /path/to/PDFXCView.exe "$PWD"/my.pdf

没有。

  1. 绝对路径参数仅由 使用PDFXCView.exe,而不是由 wine,因此将绝对路径转换为 ​​wine 可识别的路径没有帮助。例如,wine /path/to/PDFXCview.exe "$(winepath /tmp/test/O.pdf)"无法PDFXCview.exe找到并打开 pdf 文件,其中 wine 可识别的路径为:

    $ echo wine /path/to/PDFXCview.exe "$(winepath /tmp/test/O.pdf)"
    wine /tmp/test/PDFXCview.exe /home/t/.wine/dosdevices/z:/tmp/test/O.pdf
    
  2. 相反,当我将文本文件指定为 的参数时 notepad.exe,我可以指定文本文件的绝对路径名或相对路径名,并且notepad.exe可以找到要打开的文本文件。例如,wine notepad "$PWD"/note和 都wine notepad note可以使记事本找到并打开文本文件 note

其他人是否也存在上述情况?

为什么它PDFXCview.exe不能识别其参数的绝对路径名,而只能识别相对路径名?

我想知道上述问题是PDFXCview.exe由于程序本身还是 Wine 引起的?我没有 Windows 可以测试,也想知道它PDFXCview.exe在 Windows 中的行为是否与在 Wine 中的行为相同。

谢谢。


Drive 标签的屏幕截图winecfg

在此处输入图片描述

答案1

你提供的是绝对的Linux 风格Wine 正在执行的 Windows 可执行文件的路径,而不是将该路径参数提供给 Wine 本身。因此,您必须将路径后面的每个参数视为.exeWindows 样式的参数(即wine /home/$USER/.wine/drive_c/path/to/Windows/executable.exe [Windows Style Arguments])。

完整的Linux样式路径适用于notepad.exe,但考虑这notepad.exe可能不是纯 Windows版本的记事本,它包含在 Wine 设置中,并且可能经过调整以接受 Linux 路径(如/tmp/test/O.pdf)。

wine然而,大多数可以执行的应用程序确实不是有这些调整,因此只接受 Windows 样式的路径。因此,您需要为这些应用程序提供一个 Windows 样式的路径,格式类似于,C:\Windows\System32\...但与文件的实际位置有关,并与 Wine 中的驱动器映射有关,同时考虑 Bash / Linux 控制台样式的路径解释*。

首先,找到驱动器映射以及它们在 Linux 文件基础架构中“存在”的位置。 为此,请加载winecfg,然后在 Wine 配置窗口中,转到“驱动器”选项卡。它看起来会像这样:

Wine 配置:驱动器

如您所见,我已将C:映射到 Winedrive_c目录(在本例中为 )/home/teward/.wine。我还有一个驱动器M:映射到我的目录,这很重要,因为我在 Wine 应用程序中/mnt/引用了一些东西。M:\

什么是最相关是映射,它映射到我的 Linux 环境中的Z:根分区。这/通常是默认映射,但不一定会出现在您的环境中(因此请确保它会出现)。无论 Wine 驱动器映射到哪个/,您都需要使用。如果不存在,您需要添加一个驱动器映射,该映射应与/您使用 Windows 应用程序打开的数据所在的实际目录相匹配。从技术上讲,您可以T:映射到/tmp/然后执行T:\0.pdf,但我不会假设这是我的答案。

因此,为了回答这个问题,我将假设它Z:实际上已经映射到/并且从现在开始在我的回答中使用它。

您需要获取 Linux 路径并将其从Z:\驱动器根目录转换为 Windows 样式。因此,/tmp/test/0.pdf在 Linux 中,您实际上会给出它'Z:\tmp\test\0.pdf'(包括单'引号,以便 shell 不会混淆路径的解释*)。这样,Windows 样式的应用程序就会获得一条它可以读取和理解的路径,而不是一条它不能读取和理解的路径。

实际上,很少有 Wine 应用程序能够理解/foo/bar/bazLinux 风格的路径,大多数能够理解 Linux 风格的路径的应用程序都是在 Wine 设置过程中经过调整和安装的。因此,最好为 Wine 中运行的 Windows 应用程序提供 Windows 风格的路径,而不是 Linux 风格的路径。


* 当我提到“解释”时,我不是指:,而是\指路径中的 。尽管您的路径不包含空格,但我也指空格。在 Bash 语法中, 用作\转义字符的一部分。此外,在命令行中,参数以空格分隔,因此它不知道如何处理路径中的空格,因此您必须使用反斜杠对它们进行转义。因此对于C:\Program Files\Foo\bar.exe,您实际上必须C:\\Program\ Files\\Foo\\bar.exe为路径输入 。但是,使用默认的 Bash shell,您可以通过用单引号( )包裹路径来消除对斜杠和空格的误解,单引号会将'其视为传递的文字参数,因此您不必'C:\Program Files\Foo\bar.exe'处理转义反斜杠或空格。

相关内容