Java - Windows - Name eines aktuell laufenden Command Prompt ermitteln

Hallo Leute,

Ich überprüfe in einem Java Programm ob bestimmte Prozesse (Anwendungen) laufen. Das funktioniert für executables sehr gut.
Nun gibt es aber auch Programme, welche über ein batch gestartet wurden und unter dem Windows-Befehlsprozessor laufen.

Wie kann ich abfragen ob ein bestimmtes CMD gerade läuft? Es existiert ein Befehlsprozessor und darunter werden alle CMD Prompts angezeigt. Wie komme ich auf deren Namen?

!

Hier der Code mit welchem ich Standard Executables auslesen kann:

   private void checkRunningProgramms() throws IOException
    {
                    String line;
                    String pidInfo ="";

                    Process p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");

                    BufferedReader input =  new BufferedReader(new InputStreamReader(p.getInputStream()));

                    while ((line = input.readLine()) != null) {
                        pidInfo+=line; 
                    }

    input.close();
//ab hier nicht relevant für die Frage
    if(pidInfo.contains(processes.get(0)))    {   updateProgress(true,1); this.processesRun.set(0,true);}
    else   {  updateProgress(false,1); }
    if(pidInfo.contains(processes.get(1)))    {   updateProgress(true,2); this.processesRun.set(1,true);}
    else   {  updateProgress(false,2); }
    if(pidInfo.contains(processes.get(2)))    {   updateProgress(true,3); this.processesRun.set(2,true);}
    else   {  updateProgress(false,3); }
    
}

So ganz ist nicht klar, was du da rausziehen willst. Aber mit dem Parameter -V werden Zusatzinformationen angezeigt, im speziellen der Fenstertitel.

Die Brüchigkeit dieses Ansatzes ignorierend…

d.h. ignorierend, dass da Betriebssystemspezifisch und “tasklist”-spezifisch rumgeparst und Strings zerschnippelt werden:

package bytewelt;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class CommandPromptNames
{
    public static void main(String[] args) throws IOException
    {
        checkRunningProgramms();
    }

    private static void checkRunningProgramms() throws IOException
    {
        Process p = Runtime.getRuntime()
            .exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe -V");

        BufferedReader input =
            new BufferedReader(new InputStreamReader(p.getInputStream()));

        StringBuilder sb = new StringBuilder();
        while (true)
        {
            String line = input.readLine();
            if (line == null)
            {
                break;
            }
            if (!line.trim().isEmpty())
            {
                sb.append(line).append("\n");
            }
        }
        input.close();
        String pidInfo = sb.toString();
        dissectOutput(pidInfo);
        //System.out.println(pidInfo);
    }
    
    private static void dissectOutput(String output)
    {
        List<String> lines = Arrays.asList(output.split("\\n"));
        //lines.forEach(System.out::println);

        String separatorLine = lines.get(1);
        int windowTitleStartIndex = separatorLine.lastIndexOf(" ");
        for (int i = 2; i < lines.size(); i++)
        {
            String line = lines.get(i);
            String windowTitle = line.substring(windowTitleStartIndex + 1);
            String prefix = "Eingabeaufforderung - ";
            //System.out.println("windowTitle "+windowTitle);
            if (windowTitle.startsWith(prefix))
            {
                String name = windowTitle.substring(prefix.length()).trim();
                System.out.println("Name: " + name);
            }
        }
    }
}

Hab’ gerade in zwei command-prompts verschiedene dir-Befehle laufen lassen und dann dieses Programm gestartet, und die Ausgabe ist

Name: dir  /s
Name: dir  /s /b

War’s das?

Moin!

Danke dir! (wenn ich die Möglichkeit hätte, würde ich nicht Java verwenden, sondern in diesem Fall auf Microsoft eigene Sprachen zurückgreifen, da diese das unterstützen (leider geht dass nicht))

Ich werde das ausprobieren.

P.S.: Wie würde den der plattformunabhänge Ansatz ohne “tasklist - string zerschnippsle” aussehen um zu überprüfen ob bestimmte Programme (.exe, .bat, .cmd) auf Windows (< das ist ja eine Plattform) laufen?

Ok… mit weiteren 2 Stunden Suche konnte ich eine Lösung herbeiführen.

tasklist.exe /nh /fi “windowtitle eq Fenstername*”

Hiermit bekomme ich eine String zurück, welcher cmd.exe enthält, wenn der Fenstername gefunden wird und eine Information, wenn nicht.

Process x = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe /nh /fi \"windowtitle eq Fenstername*\"");
                    
                    BufferedReader input2 = new BufferedReader(new InputStreamReader(x.getInputStream()));
                    
                    while((line2 = input2.readLine()) != null)
                    {
                        pidInfo2+=line2;
                       
                    }

Wobei line2 dann den String enthält.

Danke trotzdem für die Bemühungen!

Du kannst in der Batchdatei auch mit

title bla bla

einen Titel vergeben, vielleicht lässt sich der sicherer finden?

Jo, das ausgeführte batch und auch die dadurch startende Software hat bereits einen eindeutigen Fensternamen. Danke!