【问题标题】:How to tell if JAR file is ran by a sh script or a bat script in JAVA如何判断 JAR 文件是由 JAVA 中的 sh 脚本还是 bat 脚本运行的
【发布时间】:2017-07-27 12:32:38
【问题描述】:

您好,我有一个 JAR 文件,它可以由 bat 文件和 sh 文件运行。在 JAR 中,我想要某种变量标志来跟踪 JAR 是由 bat 文件还是由 sh 文件运行的。环顾stackoverflow,但找不到类似的主题。那可能吗?谢谢。

【问题讨论】:

  • 我想你想在 Windows 机器上检查这个?无法在 unix 上运行 bat(尽管在 unix 上除了 bash 之外还有其他 shell)
  • 是的,他们使用什么机器并不重要,只要他们正在运行的脚本类型。 Bat 和 sh 用于 Windows,仅 sh 用于 Linux。
  • 取决于平台。 Windows 支持 bat 文件; UNIX 和朋友支持 sh 文件。它对您的应用程序的启动方式有什么影响?
  • @EJP - 如果您安装了 microsoft 的 bash 或使用 cygwin,您可以在 Windows 上启动 .sh 文件。
  • 你的 Java 代码不应该关心它是如何启动的。

标签: java batch-file sh


【解决方案1】:

这应该不是问题。在您的 bat 或 sh 中设置一个非常具体的环境变量(就在您的 jar 启动之前),因此任何其他服务都不太可能设置同名的验证(或考虑变量的某些特定值)。在您的代码中读取变量,以便您的代码可以检测到它是从哪里开始的。

查看详情here

【讨论】:

    【解决方案2】:

    你需要获取java的父进程并检查它。最简单的方法是使用powershell(默认从windows 7/server 2008安装):

    public static void main(String[] args){
        if (System.getProperty("os.name").toLowerCase().contains("windows")){
            String pid=ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
            System.out.println(pid);
            String pscommand="powershell $pp=(gwmi win32_process|Where-Object {$_.ProcessId -eq "+pid+"}).ParentProcessId;(gwmi win32_process |Where-Object {$_.ProcessId -eq $pp}).Caption";
            Process powerShellProcess;
            int exitCode=0;
            String shell="";
    
            try {
                powerShellProcess = Runtime.getRuntime().exec(pscommand);
    
                BufferedReader stdInput = new BufferedReader(new
                        InputStreamReader(powerShellProcess.getInputStream()));
    
                //BufferedReader stdError = new BufferedReader(new
                //        InputStreamReader(powerShellProcess.getErrorStream()));
    
                String s = stdInput.readLine();
                System.out.println(s);
                if(s.toLowerCase().equals("cmd.exe")){
                    System.out.println("called from batch or cmd.exe directly");
                } else if (s.toLowerCase().equals("bash.exe")){
                    System.out.println("called from bash.exe or .sh script");
                } else {
                    System.out.println("called from smething else");
                }
    
                powerShellProcess.getOutputStream().close();
                powerShellProcess.getInputStream().close();
                powerShellProcess.getErrorStream().close();
                exitCode=powerShellProcess.waitFor();
                System.out.println("Exit code from getting shell type: "+exitCode );
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-18
      • 2010-11-09
      • 2019-05-21
      • 2019-11-12
      • 2011-04-18
      • 2017-01-05
      • 1970-01-01
      • 2018-08-10
      相关资源
      最近更新 更多