1

我有两个convert.exe在我的PATH. 其中一个来自 ImageMagick,另一个来自 Windows。

user=> (clojure.java.shell/sh "where" "convert")
{:exit 0, :out "E:\\Program Files\\ImageMagick-6.8.3-Q16\\convert.exe\r\nC:\\Windows\\System32\\convert.exe\r\n", :err ""}

我想convert.execlojure.java.shell/sh. 通常,我可以在 PowerShell 中执行此操作。

PS E:\Users\bt> convert --version
Version: ImageMagick 6.8.3-8 2013-03-04 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2013 ImageMagick Studio LLC
Features: DPC OpenMP
Delegates: bzlib fontconfig freetype jng jp2 jpeg lcms lzma pango png ps tiff x xml zlib

但是,这在clojure.java.shell/sh.

user=> (clojure.java.shell/sh "convert" "--version" :dir "E:/Users/bt")
{:exit 4, :out "", :err "Invalid drive specification.\r\n"}

最初,我认为我需要将 ImageMagick 的路径移到我的前面,PATH以便它优先于 Windows 的二进制文件,但这没有任何效果。另外,我把它移到了PATH只是为了踢球。那也没用。

我知道解决此问题的唯一替代方法是重命名其中一个可执行文件。但这是不受欢迎的,因为我不希望其他人重命名他们的 ImageMagick/Windows 二进制文件只是为了让我的代码工作。

如果此信息有任何用处,则打开一个新的命令外壳(不是 PowerShell,而是cmd.exe)以C:\Windows\System32. 我有一种感觉,这可能会影响可执行文件的选择,但我不确定。只有当我cmd.exe从 Launchy 运行时才会发生这种情况。如果我使用开始菜单,它将在我的主目录中启动。

有没有办法做到这一点?我觉得我错过了一些明显的东西。

4

2 回答 2

1

您可以尝试为可执行文件提供绝对路径吗?
像,

user=> (clojure.java.shell/sh "E:\\Program Files\\ImageMagick-6.8.3-Q16\\convert.exe" "--version" :dir "E:/Users/bt")

或者

user=> (clojure.java.shell/sh "E:\\Progra~1\\ImageMagick-6.8.3-Q16\\convert.exe" "--version" :dir "E:/Users/bt")
于 2013-03-18T07:21:05.967 回答
1

我可以重现你的结果。不管是什么原因,它被埋在 Java 的某个地方,Runtime.exec它接收 PATH,但也许它在前面添加了 Windows 系统目录?如果你想彻底了解它,这就是你应该继续调查的地方。

请参阅对它的调用sh

  (let [...
        proc (.exec (Runtime/getRuntime)
          (into-array cmd)
          (as-env-string (:env opts))
          (as-file (:dir opts)))]

但是,如果您提供可执行文件的绝对路径,它确实有效。所以,这里有两个选项可以解决这个问题:

  • 如果可以安全地假设 IM convert.exe 是 PATH 上的第一个,只需执行问题中显示的“where”,从:out返回的第一个路径中获取第一个路径,附加convert.exe到它并将结果用作程序到sh.
  • 如果您无法假设正确的路径,请询问用户 Image Magick 的安装位置并将程序路径存储在某处。将此添加到程序路径中。
于 2013-03-18T10:15:00.490 回答