Lieber Besucher, herzlich willkommen bei: Delphi-Treff-Forum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

netpilots

Benutzer

  • »netpilots« ist der Autor dieses Themas

Beiträge: 21

Registrierungsdatum: 12. September 2008

  • Private Nachricht senden

1

Montag, 9. April 2012, 20:26

ShellExecute mit Parametern

Ich führe ShellExecute aus und möchte den Output (StdOut nehme ich an) in eine Datei schreiben, das scheint aber nicht zu funktionieren, warum?

Verwendete Programmzeile.

Quellcode

1
  ShellExecute(Handle,'open', PChar('systeminfo.exe'), PChar(' > C:\temp\SystemInfo.txt'), nil, SW_HIDE);


Das temporäre Verzeichnis ist selbstverständlich vorhanden und das ausführbare Programm auch. Habe schon auf diese Weise Programme gestartet was auch funktionierte. Es geht nur um den Output in eine Datei zu schreiben. Noch zu erwähne wäre dass es sich um eine 'normale' Delphi anwendung handelt, also keine AppType Console Vielen Dank.

Handbagger

Benutzer

Beiträge: 2 803

Registrierungsdatum: 26. Februar 2006

IDE: Lazarus

Danksagungen: 26 / 4

  • Private Nachricht senden

2

Montag, 9. April 2012, 20:41

Zitat von »netpilots;227734«

Es geht nur um den Output in eine Datei zu schreiben. Noch zu erwähne wäre dass es sich um eine 'normale' Delphi anwendung handelt, also keine AppType Console Vielen Dank.

Willst Du die Ausgabe umleiten, dann musst wohl auch die Basis - den Kommandozeileninterpreter - dazu aufrufen:

Delphi-Quellcode

1
ShellExecute(0,nil,'cmd.exe','systeminfo.exe > C:\temp\SystemInfo.txt', nil, SW_HIDE); 

PChar-Umwandlung brauchst Du nur, wenn Du eine Variable hier übergeben/einfügen willst. Konstante Strings werden direkt angepasst...

netpilots

Benutzer

  • »netpilots« ist der Autor dieses Themas

Beiträge: 21

Registrierungsdatum: 12. September 2008

  • Private Nachricht senden

3

Montag, 9. April 2012, 21:23

Zitat von »Handbagger;227737«

Willst Du die Ausgabe umleiten, dann musst wohl auch die Basis - den Kommandozeileninterpreter - dazu aufrufen:

Delphi-Quellcode

1
ShellExecute(0,nil,'cmd.exe','systeminfo.exe > C:\temp\SystemInfo.txt', nil, SW_HIDE); 

PChar-Umwandlung brauchst Du nur, wenn Du eine Variable hier übergeben/einfügen willst. Konstante Strings werden direkt angepasst...


Es funktioniert noch nicht. Auch nicht wenn ich den Pfad explizit angebe. Die Anwendung scheit zu starten aber der Output verschwindet im Nichts.

So habe ich es gemacht, PChar halt aus Gewohnheit weil später sicher Variablen rein kommen:

Quellcode

1
  ShellExecute(Handle,'open', PChar('c:\windows\system32\cmd.exe'), PChar('c:\windows\system32\systeminfo.exe > C:\temp\SystemInfo.txt'), nil, SW_HIDE);


Habe auch experimentiert mit 'open' und nil und dem handle, daran scheint es nicht zu liegen die Anwendung scheint ja zu starten und auch zu beenden.

Handbagger

Benutzer

Beiträge: 2 803

Registrierungsdatum: 26. Februar 2006

IDE: Lazarus

Danksagungen: 26 / 4

  • Private Nachricht senden

4

Montag, 9. April 2012, 22:21

Ok, mein Fehler! Das Teil muss auch geschlossen (/C) werden:

Delphi-Quellcode

1
ShellExecute(0,nil,'cmd.exe','/C systeminfo.exe > C:\temp\SystemInfo.txt', nil, SW_HIDE); 

Relative Pfade zu vermeiden, ist schon mal gut von dir! Davon aber abgesehen, ShellExecute ist eine Funktion - man wertet den Rückgabewert aus. Tut zwar nichts zur Sache, aber generell...

netpilots

Benutzer

  • »netpilots« ist der Autor dieses Themas

Beiträge: 21

Registrierungsdatum: 12. September 2008

  • Private Nachricht senden

5

Dienstag, 10. April 2012, 03:57

Vielen Dank, jetzt funktioniert es so:

Quellcode

1
2
iErr:=ShellExecute(0,nil, 'cmd.exe', PChar('/c systeminfo.exe > %temp%\' + sFN), nil, SW_HIDE);
if iErr <= 32 then // ErrorHandling

netpilots

Benutzer

  • »netpilots« ist der Autor dieses Themas

Beiträge: 21

Registrierungsdatum: 12. September 2008

  • Private Nachricht senden

6

Freitag, 20. April 2012, 14:50

Noch eine Zusatzfrage

Wenn ich ShellExecute so ausführe

Quellcode

1
2
3
ShellExecute(0,nil, 'cmd.exe', PChar('/c systeminfo.exe > %temp%\' + sFN), nil, SW_HIDE);
Delay(????) // Genügend lange warten und es funktioniert
if FileExists(GetTempDir+sFN) then ....

und gleich danach das entstehende File öffnen möchte geht das nicht weil es noch nicht fertig erstellt wurde.
Wie kann man die Ausführung der Folgezeilen von ShellExecute so verzögern bis ShellExecute fertig ist. Habe mal Delay(5000) versucht und es funktioniert. Delay ist eine eigene Prozedur die im Loop Application.ProcessMessages enthält. Optimal ist das nicht, Delay könnte je nach Computer länger oder kürzer sein.

DeddyH

Moderator

Beiträge: 5 078

Registrierungsdatum: 14. April 2010

IDE: Delphi XE

Danksagungen: 162 / 6

  • Private Nachricht senden

7

Freitag, 20. April 2012, 15:08

Such einmal nach ShellExecuteEx in Kombination mit WaitForSingleObject, da sollten sich Lösungen finden lassen.
10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.