Externe Applikation oder Windows-Batch aus Javascript ausführen

Manchmal ist es sinnvoll, aus der individuellen Maske nach einer bestimmten Aktion (z.B. nach dem Speichern) eine parametrisierte Batch-Datei oder eine Applikation auf dem Server (auf dem cmdbcore.exe läuft) auszuführen. Direkt aus dem Client-Browser ist dies natürlich nicht möglich, daher behelfen wir uns mit der Server-Side-Programmierung, die es ermöglicht, die Logik auf dem Server in C# zu programmieren (teilweise).

In diesem Beispiel wird demonstriert

Aufgabe

Nach dem Speichern eines Rechners sollte auf dem Server eine Standard-Konfigurationdatei (sofern sie noch nicht existiert) aus einem Muster erstellt werden.

Tabellen und Spalten

HWMRechner-Tabelle
HWM.HWM_COMPNAMERechnername

Ausgangssituation

Wir nutzen eine Maske für Rechnerbearbeitung (Tabelle HWM)

Lösung

Schritt 1: Batch- und Konfigurationsdatei auf dem Server vorbereiten

c:\test\_muster.cfgInhalt frei
c:\test\copy_muster.bat
copy c:\test\_muster.cfg c:\test\%1%.cfg

Hinweis: die Funktionalität dieser Batch-Datei könnte auch direkt mit Server-Side-Programmierung erzeugt werden. In diesem Beispiel dient das Batch nur zur Demonstration.

Schritt 2: SQL-API für die Umwandlung von Rechner-Id in Rechnername

Reiter Server-Side-Code ➟ unten Button "Hinzufügen" ➟ SQL:

Name GetRechnerName
Rückgabewert string
Parameter Typ=int, Name=hwmid
Button "OK"
SQL:
select HWM_COMPNAME from HWM where HWM_ID = @hwmid

Schritt 3: Serverfunktion CallExternalBat

Reiter Server-Side-Code ➟ unten Button "Hinzufügen" ➟ Serverfunktion:

Name CallExternalBat
Rückgabewert string
Parameter Typ=string, Name=rechnerName
Button "OK"

C#:
/* returns: null wenn OK, ansonst Fehlermeldung */

string destfile= "c:\\test\\" + rechnerName + ".cfg";
if (!System.IO.File.Exists(destfile)) // wenn nicht existent
{
    // run batch
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.FileName = "C:\\test\\copy_muster.bat";
    p.StartInfo.Arguments = rechnerName;
    p.StartInfo.CreateNoWindow = true;
    try { p.Start(); } catch(System.Exception e) { return e.Message; }
}

return null;

Schritt 4: Alles im MainForm.AfterSave nutzen

Reiter "Design" ➟ Hauptformular (MainForm) ➟ Ereignisse (Server) ➟ AfterSave:

var errmsg = this.CallExternalBat( this.GetRechnerName(MainForm.BaseObjID) );
if (errmsg != null) PostJS.Alert(errmsg);    

Testen

Nach dem Speichern des Rechners mit dem Namen "NB1234" sollte die Datei c:\test\NB1234.cfg angezeigt werden.