如何判断JAR文件是否由JAVA中的sh脚本或bat脚本运行

时间:2017-07-27 12:32:38

标签: java batch-file sh

您好我有一个可以通过bat文件和sh文件运行的JAR文件。在JAR中我想要一些变量标志来跟踪JAR是由bat文件还是sh文件运行的。看看stackoverflow,但无法找到类似的主题。那可能吗?感谢。

2 个答案:

答案 0 :(得分:0)

这应该不是问题。在你的bat或sh中设置一个环境变量(就在你的jar启动之前),这是非常具体的,所以任何其他服务都不可能设置相同名称的veriable(或者想出变量的某些特定值) )。在您的代码中读取变量,以便您的代码可以检测它的起始位置。

查看详细信息here

答案 1 :(得分:0)

您需要获取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();
        }
    }

}