在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
没有。
-
绝对路径参数仅由
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
- 相反,当我将文本文件指定为
notepad.exe
的参数时,我可以指定文本文件的绝对路径名或相对路径名,notepad.exe
可以找到要打开的文本文件。 例如,wine notepad "$PWD"/note
和wine 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配置窗口中,转到“驱动器”选项卡。 它看起来像这样:
如您所见,我有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'
无需处理转义反斜杠或空格。