Korrektes Benutzen von RunShell()

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Highlander
Rookie
Rookie
Beiträge: 2
Registriert: Mi, 11. Jun 2025 8:29
Hat sich bedankt: 1 Mal

Korrektes Benutzen von RunShell()

Beitrag von Highlander »

Hallo,

ich bin sehr neu in dem Gebiet Xbase und programmiere demnach mehr nach Gefühl und durch googlen *G*

Nun habe ich eine Aufgabe eine .exe automatisiert zu starten mit gewissen Parametern.
In meinem Code sieht es so aus:

Code: Alles auswählen

local cCmdParam
local lsuccess := .f.

cCmdParam := '--mode unattended '
cCmdParam += '--installdir "C:\j_services\Daten" '
cCmdParam += '--unattendedmodeui minimalWithDialogs '
cCmdParam += '--install_or_update update'

lsuccess:= (0 = RunShell(cCmdParam, "C:\j_services\Daten\installer.exe", .f., .f.))
if lsuccess == 0
    Prot("Update erfolgreich installiert.")
else
    Prot("Update fehlgeschlagen!")
endif
Im ersten Schritt habe ich die Pfade hardcoded eingetragen, bevor ich noch an den Pranger gestellt werde *G*.

Das Problem:
Das Programm (Dienst) stürzt entweder ab mit der Meldung

Code: Alles auswählen

description  : Parameter hat falschen Typ
operation    : <0>==<0>
args         : N: 0
               N: 0
oder das Programm (Dienst) bleibt stecken und reagiert nicht mehr, je nachdem wie ich gerade die Parameter übergebe.

Ich bin recht Ratlos und hoffe das man mir helfen kann. Eventuell sogar mit genauer Erklärung wieso es nicht funktioniert wie ich es implementiert habe.



Grüße
Highlander
RolandG
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 407
Registriert: Mi, 09. Jan 2019 16:02
Wohnort: Neresheim
Hat sich bedankt: 9 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Korrektes Benutzen von RunShell()

Beitrag von RolandG »

um Fehlern auf die Spur zu kommen sollte man nur einen Vorgang je Zeile verwenden.
Dann sieht man eher an welcher Stelle das Programm abstürzt.

In Deinem Code hast Du bereits in lSuccess eine logische Variable die Du dann mir 0 vergleichst - das ist falsch.

vielleicht so:

Code: Alles auswählen

local nError   // hinzu

nError := RunShell(cCmdParam, "C:\j_services\Daten\installer.exe", .f., .f.)   // ändern

lSuccess := nError == 0   // ändern

if lsuccess   // ändern
...
(Und nicht gleich als Dienst laufen lassen, erst schauen ob es auch wirklich läuft.)
Gruß
Roland
Highlander
Rookie
Rookie
Beiträge: 2
Registriert: Mi, 11. Jun 2025 8:29
Hat sich bedankt: 1 Mal

Re: Korrektes Benutzen von RunShell()

Beitrag von Highlander »

Als erstes möchte ich mich bedanken für deine Tipps. Habe es auch so umgesetzt.
Hab selber noch "rumgespielt" und nun funktioniert es auch.
Hier der Code damit eventuell andere sich später mit einer ähnlichen Thematik daran ergötzen können:

Code: Alles auswählen

cCmdParam := '--mode unattended '
cCmdParam += '--installdir C:\j_services\Daten '
cCmdParam += '--unattendedmodeui minimalWithDialogs '
cCmdParam += '--install_or_update update_existing'

Prot("Starte Installer mit Parametern: " + cCmdParam + " Pfad: " + 'C:\java_services\Daten\installer.exe')

nError := RunShell(cCmdParam, "C:\j_services\Daten\installer.exe", .f., .f.)
lSuccess := nError == 0
if lsuccess
    Prot("Update erfolgreich installiert.")
else
    Prot("Update fehlgeschlagen!")
endif
Werde natürlich nun im nächsten Schritt die Pfade dynamisch auslesen.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9935
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 142 Mal
Danksagung erhalten: 484 Mal
Kontaktdaten:

Re: Korrektes Benutzen von RunShell()

Beitrag von Tom »

Du kannst Dir das "Umbuchen" des Funktionsergebnisses (nError) in die lSuccess-Variable eigentlich sparen. Außerdem könntest Du im Fehlerfall noch angeben, welcher OS-Fehler aufgetreten ist:

Code: Alles auswählen

nError := RunShell(cCmdParam, "C:\j_services\Daten\installer.exe", .f., .f.)
if nError == 0
    Prot("Update erfolgreich installiert.")
else
    Prot("Update fehlgeschlagen ("+DosErrorMessage(nError)+")!")
endif
Herzlich,
Tom
Benutzeravatar
Armin
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 411
Registriert: Mo, 26. Sep 2005 12:09
Wohnort: 75331 Engelsbrand
Danksagung erhalten: 5 Mal
Kontaktdaten:

Re: Korrektes Benutzen von RunShell()

Beitrag von Armin »

Hallo Highlander,

das sollen doch 4 Parameter sein - oder?
cCmdParam := '--mode unattended '
cCmdParam += '--installdir "C:\j_services\Daten" '
cCmdParam += '--unattendedmodeui minimalWithDialogs '
cCmdParam += '--install_or_update update'
das könnte problematisch mit den Leerzeichen werden - weil die Leerzeichen die Parameter trennen...
Bin mir jetzt nicht 100% sicher, aber wenn das 4 Parameter sein sollen, dann besser jeden in Hochkomma setzen - oder ein "=" statt " "
cCmdParam := '"--mode unattended" '
cCmdParam += '"--installdir C:\j_services\Daten" '
cCmdParam += '"--unattendedmodeui minimalWithDialogs" '
cCmdParam += '"--install_or_update update" '

Grüße
Armin
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9935
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 142 Mal
Danksagung erhalten: 484 Mal
Kontaktdaten:

Re: Korrektes Benutzen von RunShell()

Beitrag von Tom »

Faktisch sind es acht Parameter, aber der Präfix -- verrät dem Empfänger der Parameter, dass der nächste Parameter der zweite Parameter zum vorigen Parameter ist. Passt schon.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15798
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 87 Mal
Danksagung erhalten: 43 Mal
Kontaktdaten:

Re: Korrektes Benutzen von RunShell()

Beitrag von brandelh »

kreuzigt mich, falls ich mich irre, aber ich meine dass man = bei numerischen, logischen und Datumswerten nutzen soll.
Der binäre Vergleich ob beide identisch sind (==) macht nur bei Strings sinn, da dort die Länge bei = eine Rolle spielt.

Handbuch:
==
Exactly equal operator (binary): tests whether two values are identical.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9935
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 142 Mal
Danksagung erhalten: 484 Mal
Kontaktdaten:

Re: Korrektes Benutzen von RunShell()

Beitrag von Tom »

Ja, so nutze ich == auch, nur bei Strings. Es schadet m.E. aber bei allen anderen nicht.
Herzlich,
Tom
Antworten

Zurück zu „Newbie“