如何在不带.cmd后缀的Scala中运行gsutil?

时间:2019-04-24 11:02:47

标签: scala batch-file sbt gsutil

我正在尝试在Scala中运行gsutil,但是除非我在代码中明确放置.cmd,否则它将无法正常工作。我不喜欢这种方法,因为其他人使用Unix系统。如何让Scala理解gsutil == gsutil.cmd?我可以编写一个自定义的shell脚本并将其添加到path,但是我想要一个不包含脚本的解决方案。

我已经尝试了各种环境变量(使用IntelliJ,不知道它是否相关)。我尝试将/bin/platform/gsutil都添加到路径中,但都不起作用(至少没有.cmd)。我也尝试过给出完整的路径,看看它是否有所作为,没有。

这是使用gsutil的方法:

def readFilesInBucket(ss: SparkSession, bucket: String): DataFrame = {
    import ss.implicits._

    ss.sparkContext.parallelize((s"gsutil ls -l $bucket" !!).split("\n")
        .map(r => r.trim.split("  ")).filter(r => r.length == 3)
        .map(r => (r(0), r(1), r(2)))).toDF(Array("Size", "Date", "File"): _*)
}

这是我关于SO的第一个问题,对于可能出现的格式错误,我深表歉意。


编辑: 发现,即使我编写如下脚本:

exec gsutil.cmd "$@"

在同一文件夹中仅称为gsutil,它发出与以前相同的错误消息:java.io.IOException: Cannot run program "gsutil": CreateProcess error=2, The system cannot find the file specified

如果我在git bash中编写gsutil,它会起作用,否则,如果没有该脚本,它将无法正常工作。

1 个答案:

答案 0 :(得分:2)

无论您使用的是Windows还是* nix系统,也许只是使用其他版本?

创建一些助手:

object SystemDetector {
  lazy val isWindows = System.getProperty("os.name").startsWith("Windows")
}

然后像这样使用它:

def readFilesInBucket(ss: SparkSession, bucket: String): DataFrame = {
   import ss.implicits._

   val gsutil = if(SystemDetector.isWindows) "gsutil.cmd" else "gsutil"

   ss.sparkContext.parallelize((s"$gsutil ls -l $bucket" !!).split("\n")
       .map(r => r.trim.split("  ")).filter(r => r.length == 3)
       .map(r => (r(0), r(1), r(2)))).toDF(Array("Size", "Date", "File"): _*)
   }