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

问题描述 投票:0回答:1

我试图在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,它会工作,否则在没有脚本的情况下无效。

scala batch-file sbt gsutil
1个回答
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"): _*)
   }
© www.soinside.com 2019 - 2024. All rights reserved.