【发布时间】:2025-12-14 21:05:03
【问题描述】:
我正在尝试从 Java 应用程序在 Windows 上执行 Cygwin 命令。在 cygwin 的 bin 中,我注意到有些文件是应用程序类型 (.exe),而其他文件(如 zcat 和 zless)没有扩展名,只是文件类型。
我已将 bin 添加到 Windows PATH 并且似乎只能从 cmd 执行 .exe 文件。下面的代码有效。
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "ls");
Process p = pb.start();
我想使用 zcat 和 zless 之类的东西,但它们不可执行,并且 cmd 抱怨“zcat”未被识别为内部或外部命令, 可运行的程序或批处理文件。
如果我手动将文件更改为 .exe,我会收到一个弹出错误消息,指出由于与 64 位版本的 Windows 不兼容,zcat 无法启动或运行。我已经安装了 64 位版本的 cygwin (setup-x86_64)。为什么 cygwin 的 bin 不是所有可执行文件?
【问题讨论】:
-
添加“.”到
PATHEXT环境变量以允许CMD 执行没有文件扩展名的PE 映像。如果由于文件不是有效的 32 位或 64 位 PE 映像而导致内部CreateProcessW调用失败,这当然无济于事。它将退回到ShellExecuteExW,它会查找已注册的“。”文件关联。 -
zcat可能是一个 sh 或 bash shell 脚本,因此它们必须使用sh或bash运行,而不是使用cmd,这仅适用于 Windows 脚本。 -
添加“.”后到 PATHNEXT,cmd 可以找到该命令,但由于与 64 位 Windows 不兼容而无法执行。我安装了 64 位 cygwin,所以我想我无能为力了。
-
尝试
type "path\to\zcat"来检查它是否是一个 Unix shell 脚本,即一个包含 shebang 行和 Unix shell 命令的文本文件。如果是这样,您可以通过sh -c "path/to/zcat"运行它。在 Windows 中,可以关联“.”。 (即没有扩展名的文件)使用像"path\to\sh.exe" -c "%1" %*这样的 progid 模板命令——但我不推荐它,而且它可能无论如何都不起作用,因为 Windows 将用 DOS 路径替换“%1”目标路径,这.exe 可能不支持。 -
这是我遇到的另一个问题。由于某种原因,我无法直接执行任何 cygwin 命令。我只能在它们位于 cmd 的 PATH 中时使用它们。 *.com/questions/54818613/…