Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern (https://www.delphipraxis.net/160957-shellexecute-probleme-bei-der-uebergabe-von-zusaetzlichen-programmparametern.html)

FriendOfDelphi 9. Jun 2011 15:33

Delphi-Version: 5

ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Hallo Allerseits,

ich habe Probleme bei der Übergabe von Parametern, die man dem aufzurufenden Programm mit gibt.
Der eigentliche Aufruf des Programms über
Delphi-Quellcode:
ShellExecute
ist klar:
Delphi-Quellcode:
ShellExecute(Handle, 'open', PChar(DateiName), PChar(Parameter), PChar(VerzeichnisPfad), SW_SHOWNORMAL);
Probleme machen hier die Parameter.
Die da lauten '-h hostname -u username -ppasswort -e "SELECT * FROM datenbank.tabelle" > ausgabe.txt'.
Ziel ist es aus Delphi heraus ein MySQL-Kommando auf der Kommandozeile auszuführen.
Wenn ich das Kommando mit mysql.exe -h hostname -u username -ppasswort -e "SELECT * FROM datenbank.tabelle" > ausgabe.txt direkt aus der cmd-Shell heraus aufrufe, funktiniert alles prima.

Wenn ich die Umleitung in die Datei weglasse (also > ausgabe.txt), funktioniert dies auch aus Delphi heraus.
Das Problem muss also im hinteren Teil des Parameterstrings liegen.
Wahrscheinlich kommt
Delphi-Quellcode:
ShellExecute
nicht mit den Leerzeichen, oder dem "größer als-Zeichen" nach den hinteren doppelten Anführungsstrichen (") klar.

Kann jemand helfen?

Deep-Sea 9. Jun 2011 15:52

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Wenn mich nicht alles täuscht, dann liegt das Problem an der Umleitung in eine Datei. Das geht hier nicht so einfach. Du musst die Ausgabe selbst abfangen (mal danach googlen) und auch selbst in eine Datei schreiben. :stupid:

DeddyH 9. Jun 2011 15:55

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Ein Test mit dem Kommando
Code:
cmd /c echo "Hallo Welt" > C:\temp\Bla.txt
(cmd.exe als Programmname, der Rest als Parameter) hat bei mir funktioniert. Evtl. wird die Datei erzeugt, aber nicht im erwarteten Verzeichnis?

jaenicke 9. Jun 2011 17:14

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Dass die cmd.exe pipen kann, ist klar, nur halt nicht das andere Programm. Klar kann man das wiederum über die cmd.exe aufrufen, damit pipen geht statt die Ausgabe selbst einzufangen, aber das wäre irgendwie... unnötig...

FriendOfDelphi 9. Jun 2011 18:26

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Zitat:

Zitat von DeddyH (Beitrag 1105507)
Ein Test mit dem Kommando
Code:
cmd /c echo "Hallo Welt" > C:\temp\Bla.txt
(cmd.exe als Programmname, der Rest als Parameter) hat bei mir funktioniert. Evtl. wird die Datei erzeugt, aber nicht im erwarteten Verzeichnis?

Das habe ich auch erst gedacht. Aber ein Suchlauf auf den in Frage kommenden Laufwerken brachte kein Ergebnis.

Beim Ausführen "blitzt" ganz kurz ein cmd-Fenster auf. Wenn man das mehrere Male hintereinander macht, kann man sehen, dass die Datei zwar ausgeführt wird, aber eine Fehlermeldung ausgegeben wird. Diese kann ich leider nicht lesen, da das Ganze zu schnell geht und ich keinen Aufrufparameter für
Delphi-Quellcode:
ShellExecute
gefunden habe, der das Fenster offen läßt.
Wie gesagt, ich denke, dass die Parameter von
Delphi-Quellcode:
ShellExecute
nicht richtig an das Programm weitergereicht werden.

FriendOfDelphi 9. Jun 2011 18:28

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Zitat:

Zitat von jaenicke (Beitrag 1105524)
Dass die cmd.exe pipen kann, ist klar, nur halt nicht das andere Programm. Klar kann man das wiederum über die cmd.exe aufrufen, damit pipen geht statt die Ausgabe selbst einzufangen, aber das wäre irgendwie... unnötig...

Deine Antwort verstehe ich nicht so ganz.
"mysql.exe" kann definitiv pipen.
Direkt aus einem cmd-Fenster aufgerufen funktiniert ja alles.
Wie meinst Du das?

FriendOfDelphi 9. Jun 2011 18:30

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Zitat:

Zitat von Deep-Sea (Beitrag 1105505)
Wenn mich nicht alles täuscht, dann liegt das Problem an der Umleitung in eine Datei. Das geht hier nicht so einfach. Du musst die Ausgabe selbst abfangen (mal danach googlen) und auch selbst in eine Datei schreiben. :stupid:

Kannst Du das bitte mal etwas näher erläutern.

jaenicke 9. Jun 2011 19:47

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Zitat:

Zitat von FriendOfDelphi (Beitrag 1105535)
"mysql.exe" kann definitiv pipen.

Irrtum.

Zitat:

Zitat von FriendOfDelphi (Beitrag 1105535)
Direkt aus einem cmd-Fenster aufgerufen funktiniert ja alles.

Du sagst es, du bist innerhalb der cmd.exe, und die kennt das Pipe-Zeichen, ja. ;-)

Du musst das Pipen, also das Auslesen der Ausgabe aus den Ausgabepipes, selbst übernehmen:
http://www.delphi-treff.de/tipps/sys...ramm-anzeigen/
usw.

Aphton 9. Jun 2011 19:55

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Oder er ruft cmd mit eben genau diesen Parametern auf:
ShellExecute(0, 'open', 'cmd /C ', 'mysql.exe -h hostname -u username -ppasswort -e "SELECT * FROM datenbank.tabelle" > ausgabe.txt', NIL, SW_SHOWNORMAL)

FriendOfDelphi 10. Jun 2011 08:03

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Zitat:

Zitat von jaenicke (Beitrag 1105558)
Zitat:

Zitat von FriendOfDelphi (Beitrag 1105535)
"mysql.exe" kann definitiv pipen.

Irrtum.

Zitat:

Zitat von FriendOfDelphi (Beitrag 1105535)
Direkt aus einem cmd-Fenster aufgerufen funktiniert ja alles.

Du sagst es, du bist innerhalb der cmd.exe, und die kennt das Pipe-Zeichen, ja. ;-)

Du musst das Pipen, also das Auslesen der Ausgabe aus den Ausgabepipes, selbst übernehmen:
http://www.delphi-treff.de/tipps/sys...ramm-anzeigen/
usw.

Ok, stimmt. Nicht mysql.exe, sondern cmd.exe verarbeitet das Pipe-Zeichen.
Aber so ganz verstehe ich das noch nicht.
Ich dachte, die Funktion
Delphi-Quellcode:
ShellExecute
ruft genau cmd.exe auf und ich befinde mich dann innerhalb dieser Shell?:?:
Und darin wird dann das Programm mysql.exe gestartet mit den Parametern, die ich zusätzlich übergeben habe.
Wo ist da mein Denkfehler?

DeddyH 10. Jun 2011 08:14

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
ShellExecute ruft das mit der angegebenen Datei und dem angegebenen Befehl verknüpfte Programm auf, sofern vorhanden.

FriendOfDelphi 10. Jun 2011 08:27

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Zitat:

Zitat von Aphton (Beitrag 1105559)
Oder er ruft cmd mit eben genau diesen Parametern auf:
ShellExecute(0, 'open', 'cmd /C ', 'mysql.exe -h hostname -u username -ppasswort -e "SELECT * FROM datenbank.tabelle" > ausgabe.txt', NIL, SW_SHOWNORMAL)

Habe ich ausprobiert. Funktioniert so nicht. Der Fehlercode, den
Delphi-Quellcode:
ShellExecute
damit zurück gibt, lautet 2 (SE_ERR_FNF = 2, 'Datei wurde nicht gefunden Quelle:http://www.tksoft-online.de/index.ph...e-methode.html).

Ich verstehe das auch noch nicht so ganz. mysql.exewird doch schon mit
Delphi-Quellcode:
ShellExecute
in der Kommando-Shall (cmd.exe) aufgerufen.

DeddyH 10. Jun 2011 08:29

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Wie ist es denn so (da war wohl ein Parameter verrutscht)?
Delphi-Quellcode:
ShellExecute(0, 'open', 'cmd.exe', '/C mysql.exe -h hostname -u username -ppasswort -e "SELECT * FROM datenbank.tabelle" > ausgabe.txt', NIL, SW_SHOWNORMAL)

Luckie 10. Jun 2011 09:18

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Wenn du die Ausgabe sehen willst, musst du die Konsole von Hand über Start/Ausführen öffnen und dort den kompletten Befehle eintippen.

Wenn Shellexecute die Datei nicht findet und du keinen Pfad zur Datei angegeben hast, liegt sie wahrscheinlich nicht im Suchpfad. Gib einen Pfad zur Datei an. Genauso solltest du einen Pfad zur Ausgabedatei angeben, sonst landet die Datei irgendwo. Denn wenn ich eine Konsole über Start/Ausführen öffne, ist das aktuelle Verzeichnis mein Benutzerverzeichnis.

FriendOfDelphi 10. Jun 2011 09:29

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Zitat:

Zitat von DeddyH (Beitrag 1105601)
Wie ist es denn so (da war wohl ein Parameter verrutscht)?
Delphi-Quellcode:
ShellExecute(0, 'open', 'cmd.exe', '/C mysql.exe -h hostname -u username -ppasswort -e "SELECT * FROM datenbank.tabelle" > ausgabe.txt', NIL, SW_SHOWNORMAL)

Das ist die Lösung und funktioniert prima.:-D Vielen Dank.

Vielleicht kann ja ein Wissender nochmal abschließend und etwas ausführlicher mit etwas Hintergrundwissen zu
Delphi-Quellcode:
ShellExecute
erklären, warum das genau so gemacht werden muss...

DeddyH 10. Jun 2011 10:12

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Das Problem ist, dass die Dateiumleitung eine "Spezialität" von %comspec% (also meist cmd.exe) ist. Deshalb musst Du auch diese starten. Was bei ShellExecute geschieht ist ja Folgendes (ich hoffe, ich gebe das jetzt korrekt wieder):
Zunächst wird die Dateiendung der übergebenen Datei daraufhin untersucht, ob sie registriert ist (Eintrag unter z.B. HKCL\.bla zeigt auf blafile). Nun wird zum geraden ermittelten Schlüssel gesprungen und dieser untersucht (bei einem 'open'-Befehl HKCL\blafile\Shell\open\command) und das dort angegebene Programm ("C:\Programme\Wuppdi\bla.exe" "%1") mit dem übergebenen Dateinamen als Parameter gestartet. Daher kann es auch sein, dass je nach Befehl (open, print etc.) unterschiedliche Programme aufgerufen werden, da in den entsprechenden Schlüsseln eben unterschiedliche Programme eingetragen sind.

jaenicke 10. Jun 2011 10:29

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Trotzdem ist das Quatsch. Denn die Textdatei liest du dann wahrscheinlich wieder in dein Programm ein, oder?

Statt dafür die cmd.exe zu nehmen kannst du die Ausgabe auch direkt auslesen wie bereits inkl. fertigem Code verlinkt. Dann funktioniert der Code auch ohne Schreibrechte auf eine Ausgabedatei...

DeddyH 10. Jun 2011 10:32

AW: ShellExecute: Probleme bei der Übergabe von zusätzlichen Programmparametern
 
Kann es nicht sein, dass er gute Gründe dafür hat, die Ausgabe in eine Datei umzuleiten? Ich finde es reichlich vermessen, das pauschal als "Quatsch" abzutun, ohne die genaue Intention dahinter zu kennen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz