您好我有一个可以通过bat文件和sh文件运行的JAR文件。在JAR中我想要一些变量标志来跟踪JAR是由bat文件还是sh文件运行的。看看stackoverflow,但无法找到类似的主题。那可能吗?感谢。
答案 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();
}
}
}