直接使用 Cygwin 程序从 Windows 打开文档

直接使用 Cygwin 程序从 Windows 打开文档

是否可以使用 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

可能有一些奇怪的文件名仍然会破坏它。但至少它适用于所有正常的文件名,包括包含空格、圆括号、方括号的文件名。

相关内容