我在用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
没有。
绝对路径参数仅由 使用
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
- 相反,当我将文本文件指定为 的参数时
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 本身。因此,您必须将路径后面的每个参数视为.exe
Windows 样式的参数(即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 配置窗口中,转到“驱动器”选项卡。它看起来会像这样:
如您所见,我已将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/baz
Linux 风格的路径,大多数能够理解 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'
处理转义反斜杠或空格。