首页 > 解决方案 > Shell 脚本在 linux 系统上工作正常,但不能在 Windows 机器上运行

问题描述

我在 Windows 机器上运行一个 java 项目,它读取 shell 脚本文件以获取授权令牌,但出现以下错误:

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 机器上运行相同的代码。

标签: javashellcmd

解决方案


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

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

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

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

推荐阅读