Shell脚本可以在Linux系统上正常运行,但不能在Windows计算机上运行

时间:2019-04-02 07:11:52

标签: java shell cmd

我正在Windows计算机上运行一个Java项目,该项目读取外壳脚本文件以获取授权令牌,但出现以下错误:

  

java.io.IOException:无法运行程序“ ./token.sh”:CreateProcess错误= 193,%1不是有效的Win32应用程序

Java program for reading the shell script:
private static String execCommand(String username){
String line;
      Process p = Runtime.getRuntime().exec("./token.sh -u " + username + " -p password123");
      BufferedReader input = new BufferedReader(new 
      InputStreamReader(p.getInputStream()));
      StringBuilder output = new StringBuilder();
      while ((line = input.readLine()) != null) {
        output.append(line);
}

如何在Windows计算机上运行相同的代码。

3 个答案:

答案 0 :(得分:1)

不会。您会看到Windows CMD和Shell中使用的命令是不同的,因为它们是完全不同的平台。即使使用Java执行,但由于根本的根本差异,它也不会执行。从您得到的异常中可以很清楚地看出。
你能做什么?

  • 通读token.sh。最有可能是内部实现 可以在Windows中实现。然后创建一个if条件 检查System.getProperty("os.name")然后如果它的窗口 调用bat文件,如果操作系统基于Unix,则调用sh文件。对于 其他所有操作系统都会抛出一个有效的异常。

  • 其他可能的方法是,如果令牌在机器中生成 独立的,您可以使用SSH(JSch或类似产品)远程连接到 并获得UNIX服务器的令牌。如果令牌是机器相关的(如果 它是一个auth令牌,那么可能是),请尝试使用Cygwin解释器 ,它本身并不能保证每个shell文件都可以在其中运行 它。

  • 将sh文件及其实现更改为python或ruby。然后可以在机器上安装各自的解释器(生产机器除外,它实际上可能具有)。
  • 在Java本身中写sh逻辑而不是保留脚本文件,因为实际上平台独立性是这里的要求,并且您已经在两台计算机上启动并运行了JRE。

答案 1 :(得分:1)

您不能这样做,因为Linux bash脚本所需的命令与Windows命令有很大不同。 例如-

  

要在Linux ls

中列出目录中的内容      

要在Windows dir

中列出目录中的内容

您必须编写独立于计算机/体系结构/ OS的代码才能在所有操作系统上运行。

也许,您可以尝试使用Python脚本。

否则,您可以在Windows计算机上ssh切换到Linux计算机,并在Linux服务器中从Windows运行该脚本。

答案 2 :(得分:0)

您还必须对此脚本进行Windows特定的实现。最常见,最简单的方法是使用powershell。

如果您想要同时在Windows和Unix上运行的版本,也许您应该研究python。