TWidmayer
Elite Observer

.bat-File auf Webserver starten

Hallo zusammen,

im Anschluss zu unserem Deployment, muss eine Batch-Datei auf dem Webserver gestartet werden,

woran ich leider scheiter.

Rufe ich die .exe im Skript direkt auf funktioniert das einwandfrei

exec("//172.***.**.***/inetpub/App-Preview/de/content/Index.exe );

jedoch ist es nun erforderlich die .exe über eine Batch-Datei auf dem Webserver zu starten.

wenn ich jedoch

   exec("//172.***.**.***/inetpub/batch/index.bat");

aufrufe, dann hängt die Aktion und wenn ich auf dem Webserver im Taskmanager schaue, ist auch die .exe die in der .bat aufgerufen wird nicht aktiv.

Hatte jemand schon mal solch ein Problem?

Habe auch hier schon gesucht und nur https://community.e-spirit.com/people/hoebbel/blog/2010/07/21/ver%C3%B6ffentlichen-ohne-sprachverzei...

gefunden, das hat mir jedoch auch nicht weiterhelfen können.

viele Grüße

Tobias

0 Kudos
9 Replies
mbergmann
Crownpeak employee

Hallo Tobias,

müsste hier nicht als Prozess cmd.exe aufgerufen werden mit der .bat als Parameter?

Viele Grüße

Michael

0 Kudos

Hallo Michael,

falls du das so meinst, dann funktioniert das auch nicht.

exec("cmd.exe /c //172.***.***.**/inetpub/batch/index.bat");

viele Grüße

Tobias

0 Kudos

Hallo Tobias,

exec("cmd.exe /c //172.***.***.**/inetpub/batch/index.bat");

sieht für mich eigentlich auch richtig aus.

Erhältst du irgendeine Fehlermeldung? Erzeugt der neue Prozess einen Error-Output?

Viele Grüße

Tim

0 Kudos

Hallo Tim,

nein so wie es aussieht wird der Befehl nicht ausgeführt.

ich hab vor und nach dem exec-Befehl eine Logausgabe, die Meldung vor dem exec sehe ich im Log... mehr nicht. ich muss den Auftrag dann aber auch abbrechen weil einfach nichts passiert.

Das ganze ist aber auch in einem try-catch, sofern es einen Fehler geben würde, würde er ja in den catch-Zweig springen.

viele Grüße

Tobi

0 Kudos

Hallo Tobias,

macht die Bat denn noch mehr, als nur die Exe aufzurufen? Nicht, dass sie auf irgendeine Benutzereingabe o.Ä. wartet...

Gruß,

Tim

0 Kudos
mikula
Crownpeak employee

Hallo Tobias,

konntest du dein Problem inzwischen lösen? Oder weißt du mittlerweile woran es liegen könnte? Dann wäre es gut, wenn du deine Lösung hier kurz beschreiben würdest, damit alle Community-Teilnehmer etwas davon haben.

Falls du noch Unterstützung benötigst, wäre die genaue FirstSpirit-Version, die bei euch im Einsatz ist, eine hilfreiche Information.

Viele Grüße

Martin

0 Kudos

Hallo Tim,

nein die Bat macht nix anderes.

@Martin,

nein Problem besteht noch, werde sofern ich was hinbekomm,

hier die Antwort schreiben.

Grüße

Tobias

0 Kudos

Hallo Tobias,

wir lösen das in einem Projekt so:

Script

//! Beanshell

script = "C:/Program Files (x86)/FirstSpirit5/deployment/XXX/XXX.bat";

import java.util.*;

tasklist = context.getTasks();

t = context.getTask();

s = t.getScheduleEntry();

p = s.getProject();

log = "";

// project id, schedule entry id, master language

projectId = "" +p.getId();

scheduleEntryId = "" +s.getId();

language = p.getMasterLanguage().getAbbreviation().toLowerCase();

// Command-Stack

cmd  = new Vector();

cmd1 = new Vector();

cmd1.addAll(Arrays.asList(new String[]{script}));

//cmd1.addAll(Arrays.asList(new String[]{projectId}));

//cmd1.addAll(Arrays.asList(new String[]{scheduleEntryId}));

//cmd1.addAll(Arrays.asList(new String[]{language}));

cmd.add(cmd1);

class StreamCapture extends Thread

{

    InputStream i;

    boolean useErrlog;

    StreamCapture(InputStream inputstream, boolean useErrorlog)

    {

        i = inputstream;

        useErrlog = useErrorlog;

    }

    public void run()

    {

        try

        {

            InputStreamReader reader = new InputStreamReader(i);

            BufferedReader buffr = new BufferedReader(reader);

            String l = null;

            while ((l = buffr.readLine()) != null)

            {

                if(useErrlog)

                {

                    context.logError(log + l);

                }

                else

                {

                    context.logInfo(log + l);

                }

            }

            //buffr.close();

            //reader.close();

        }

        catch (IOException ex)

        {

            context.logError(log + " failed: " + ex);

        }

    }

}

for(c: cmd)

{

    cmdstr = "";

    for (String s : c)

    {

        cmdstr += " " + s;

    }

    cmdstr = "ProcessBuilder(" + cmdstr.substring(1) + ")";

    context.logInfo(log + cmdstr);

    // Fixme: launch as Thread with given timeout

    try

    {

        Process p = new ProcessBuilder(c).start();

        InputStream is = p.getInputStream();

        StreamCapture stdout = new StreamCapture(p.getInputStream(), false);

        StreamCapture stderr = new StreamCapture(p.getErrorStream(), true);

        stdout.start();

        stderr.start();

        result = p.waitFor();

        //is.close();

        if ( result == 0 )

        {

            context.logInfo(log + " command completed");

        }

        else

        {

            context.logError(log + "failed with exitcode " + result + " for " + cmdstr);

            // wait 3 seconds as otherwise stderr is closed too early

            // to get all error messages.

            Thread.sleep(3000);

        }

    }

    catch (InterruptedException e)

    {

        context.logError(log + "timeout for " + cmdstr + ": " + e);

    }

    catch (Exception e)

    {

        context.logError(log + "failed for " + cmdstr + ": " + e);

    }

}

context.logInfo(log + " script completed");

0 Kudos

Vielen Dank Daniel! Das Script nach schnellem überfliegen recht brauchbar aus. Vielleicht hilft es ja Tobias weiter

viele Grüße

Martin

0 Kudos