是否可以使用 Windows 10 打开文档“打开用”Cygwin 附带的程序的功能,例如扎图拉?
这个带有 Cygwin 程序。
第一次尝试:尝试直接在Windows下使用Cygwin程序,即可执行文件C:\cygwin64\bin
(如果是标准安装路径)。
不管“打开用”问题是,除了最简单的程序(不首先运行登录 shell!)之外,直接打开 Cygwin 程序通常效果不佳。
因此,启动 Cygwin X 服务器,设置 Windows 系统环境变量DISPLAY
(这得到通过传递) 到:0.0
, 使用“打开用”并C:\book.pdf
选择C:\cygwin64\bin\zathura.exe
使 Zathura 打开 GUI 窗口。但我们得到了错误:
error: Unknown file type: 'cannot open `/cygdrive/c/Windows/system32/C:\book.pdf'
(No such file or directory)'
❓
显然,这里的路径出了问题。
第二次尝试:通过使用带有目标的 Windows 快捷方式来解决该问题:
C:\cygwin64\bin\bash.exe -l -c 'zathura "`cygpath "$0"`"'
至少这适用于 Windows 资源管理器中的拖放操作。但又不与“打开用”。
emitpath.lnk
作为一个最小的示例,创建一个带有目标的Windows 快捷方式:
C:\cygwin64\bin\bash.exe -l -c 'echo "`cygpath "$0"`" > out.path'
通过将文档拖放到快捷方式上,它再次按预期工作:在 Cygwin 主目录中out.path
创建一个文件,并且“cygwin 化“文档的路径被写入其中。我们已经非常接近了。
但是,唉,随着“打开用”这是行不通的;什么都没发生。
那么如何使用“打开用”在 Windows 10 上使用 Cygwin 程序?
一定有比创建可执行包装器更简单的方法。
答案1
制作一个批处理文件,例如:
@echo off
D:
chdir D:\cygwin64\bin
set A=%1
bash --login -c "/usr/bin/echo $(cygpath $A)"
pause
在 的根目录中Cygwin
应该存在一个Cygwin.bat
用作基础的。
将批处理文件的链接放入文件SendTo
夹中
现在,当我从图片文件夹发送图片时,我会在一个新的 CMD 窗口中看到:
/cygdrive/c/Users/Marco/Pictures/img250.jpg
Drücken Sie eine beliebige Taste . . .
最后一个是Press any key
德语。
从这里您可以修改批处理以运行您想要的任何 cygwin 程序。
如果您计划使用 X 服务器,最好先运行 Xwin 服务器,因为执行过程中可能会出现计时问题。
答案2
matzeri 解决方案的问题在于它仅适用于最理智的文件名。文件名中的空格已经破坏了它。
请记住,如果C:\book 1.pdf
是要打开的文档,我们希望最终得到一个字符串,其中在 bash 端转义是正确的 - 如下所示:
"/usr/bin/zathura \"$(cygpath 'C:\book 1.pdf')\""
但是 Windows 以两种不同的方式将文档路径作为参数传递给批处理脚本:
- “打开用”:总是双引号。
- “拖放”: 仅有的有时双引号(当存在空格时)。
由于批处理语言的转义规则非常深奥,因此最好使用大量中间变量来构建字符串;否则你会发疯的。
我们可以用:
^
逃脱了"
.但仅限于不带引号的字符串,请参阅这里!set x=%x:"=%
"
是变量 中字符串中的任何内容的替换x
。单引号
'
是普通字符,不需要转义。
所以下面的批处理文件可以完成这项工作:
@echo off
C:
cd C:\cygwin64\bin
set pdfpath=%1
set pdfpath=%pdfpath:"=%
set cygpart=$(cygpath '%pdfpath%')
set fullcmd=/usr/bin/zathura \^"%cygpart%\^"
bash -l -c "%fullcmd%"
pause
可能有一些奇怪的文件名仍然会破坏它。但至少它适用于所有正常的文件名,包括包含空格、圆括号、方括号的文件名。