如何在没有 .cmd 后缀的情况下从 Scala 运行 gsutil?

How to run gsutil from Scala without the .cmd suffix?

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

我已经尝试过各种环境变量(使用 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 就可以工作,否则没有脚本就无法工作。

也许只是使用不同的版本,无论您使用的是 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"): _*)
   }