Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure.java.shell中运行名称冲突的特定可执行文件_Shell_Clojure - Fatal编程技术网

在clojure.java.shell中运行名称冲突的特定可执行文件

在clojure.java.shell中运行名称冲突的特定可执行文件,shell,clojure,Shell,Clojure,我的路径中有两个名为convert.exe的可执行文件。其中一个来自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 ""} 我想在clojure.java

我的
路径中有两个名为
convert.exe
的可执行文件。其中一个来自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 ""}
我想在
clojure.java.shell/sh
中运行ImageMagick的
convert.exe
。通常,我可以在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的路径移动到我的
路径的前面,这样它就可以优先于Windows的二进制文件,但这没有任何效果。另外,我把它移到
路径的末尾
只是为了好玩。那也没用

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

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


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

你能试着给出可执行文件的绝对路径吗?


我可以复制你的结果。不管是什么原因,它被Java的
Runtime.exec
埋在某处,它接收路径,但它可能会在前面添加Windows系统目录? 如果你想彻底了解它,这是你应该继续调查的地方

请参见
sh
中的调用:

  (let [...
        proc (.exec (Runtime/getRuntime)
          (into-array cmd)
          (as-env-string (:env opts))
          (as-file (:dir opts)))]
但是,如果您为可执行文件提供了一个绝对路径,那么它确实可以工作。因此,这里有两种解决问题的方法:

  • 如果可以安全地假设IM convert.exe是路径上的第一个路径,只需执行问题中显示的“where”,从返回的
    :out
    中获取第一个路径,将
    convert.exe
    附加到该路径,并将结果用作
    sh
    的程序
  • 如果无法采用正确的路径,请询问用户Image Magick的安装位置,并将程序路径存储在某个位置。在程序路径前加上这个

另一个解决方法是使用imconvert.bat调用正确的版本。不太好,但比重命名可执行文件要好。您是否有当前目录(即PATH=;dir1;dir2),这将解释一切。@sw1nn,这里是。似乎PowerShell的路径是预先设置好的。我选择了第一个选项,并以编程方式使用了路径中的第一个
convert.exe
。谢谢这很有效。我将这与从
where
获取第一个值相结合,以确保调用的是正确的可执行文件。
user=> (clojure.java.shell/sh "E:\\Progra~1\\ImageMagick-6.8.3-Q16\\convert.exe" "--version" :dir "E:/Users/bt")
  (let [...
        proc (.exec (Runtime/getRuntime)
          (into-array cmd)
          (as-env-string (:env opts))
          (as-file (:dir opts)))]