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

我在wine-3.1下使用Ubuntu 16.04中的PDFXCview.exe 。

当我将pdf文件指定为PDFXCview.exe的参数时,pdf文件的绝对路径名不会使PDFXCview.exe找到pdf文件,而pdf文件的相对路径名则为pdf文件。

例如:

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

将在PDFXCView.exe打开my.pdf

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

没有。

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

     $ 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"/notewine notepad note可以使记事本找到并打开文本文件note

以上也是其他人的情况吗?

PDFXCview.exe无法识别其参数的绝对路径名,而只识别相对路径名的原因是什么?

我想知道PDFXCview.exe的上述问题是因为程序本身还是葡萄酒? 我没有Windows进行测试,也想知道PDFXCview.exe在Windows中的行为方式与Wine中的相同。

谢谢。


winecfg的Drive标签的屏幕截图

在此处输入图像描述

您正在为Wine执行的Windows可执行文件提供绝对的Linux风格路径,而不是向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配置窗口中,转到“驱动器”选项卡。 它看起来像这样:

Wine Config:驱动器

如您所见,我有C:映射到Wine drive_c目录,在此实例中位于/home/teward/.wine 。 我还有一个驱动器M:映射到我的/mnt/目录,这是相关的,因为我在Wine应用程序中有M:\引用的东西。

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

所以,为了这个答案的目的,我将假设Z:实际上映射到/并在我的答案中使用了这一点。

您需要采用Linux路径并将其从Z:\ drive根目录转换为Windows样式。 所以,对于Linux中的/tmp/test/0.pdf ,你实际上会给它'Z:\tmp\test\0.pdf' (包括单引号,所以shell不会解释*路径)。 这样,Windows风格的应用程序正在获得它可以读取和理解的路径,而不是它不能的路径。

很少有Wine应用程序实际上能够理解Linux的/foo/bar/baz样式路径,并且大多数的应用程序都是作为设置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'无需处理转义反斜杠或空格。