如何检查路径中是否存在程序

2022-09-02 19:19:48

我正在用scala编写一个程序,它调用:

Runtime.getRuntime().exec( "svn ..." )

我想检查“svn”是否可从命令行获得(即在PATH中可以访问)。我该怎么做?

PS:我的程序设计为在Windows上运行


答案 1

下面是一个 Java 8 解决方案:

String exec = <executable name>;
boolean existsInPath = Stream.of(System.getenv("PATH").split(Pattern.quote(File.pathSeparator)))
        .map(Paths::get)
        .anyMatch(path -> Files.exists(path.resolve(exec)));

替换为 以获取完全限定的路径。anyMatch(...)filter(...).findFirst()


下面是一个跨平台静态方法,用于比较常见的可执行扩展:

import java.io.File;
import java.nio.file.Paths;
import java.util.stream.Stream;

import static java.io.File.pathSeparator;
import static java.nio.file.Files.isExecutable;
import static java.lang.System.getenv;
import static java.util.regex.Pattern.quote;

public static boolean canExecute( final String exe ) {
  final var paths = getenv( "PATH" ).split( quote( pathSeparator ) );
  return Stream.of( paths ).map( Paths::get ).anyMatch(
    path -> {
      final var p = path.resolve( exe );
      var found = false;

      for( final var extension : EXTENSIONS ) {
        if( isExecutable( Path.of( p.toString() + extension ) ) ) {
          found = true;
          break;
        }
      }

      return found;
    }
  );
}

这应该解决对第一个解决方案的大多数批评。除此之外,迭代PATHEXT系统环境变量可以避免硬编码扩展,但也有其自身的缺点。


答案 2

我不是 scala 程序员,但是我会在任何语言中执行类似 '' 的东西,只是为了检查 exec 方法的返回代码(0 或 1)...如果失败,则 svn 不在路径:Psvn help

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("svn help");
int exitVal = proc.exitValue();

按照惯例,值 0 表示正常终止。


推荐