![]() |
Parameter übergeben
hei,
In meinem Programm rufe ich mit ShellEcecute ein Batch (*.BAT) auf. Diesem Batch möchte ich einen Programmnamen übergeben. Hier mein Programm-Code: procedure TForm3.Button3Click(Sender: TObject); var prog : String; Programm: String; begin Prog := Form1.Programm; //Das Programm, das kopirt werden soll ShowMessage(prog); //Hier muß es irgendwie rein ShellExecute(0, nil, 'cmd.exe', 'Transfer_TNC155.bat', nil, SW_SHOW); end; Und hier mein Batch Transfer_TNC155.bat: Echo on CD\ del /Q c:\HDH\99.txt copy /Y C:\HDH\TNC155\Prog C:\HDH\99.txt // ... und da soll es kopiert werden Wie kann ich Prog an den Batch übergeben?? |
AW: Parameter übergeben
Zitat:
|
AW: Parameter übergeben
Das Problem ist doch vermutlich, dass es eine Fehlermeldung gibt, wenn man versucht 'Transfer_TNC155.bat ' + prog zu übergeben, oder?
Die Lösung ist einfach, die Meldung sagt ja auch schon, dass PChar und String nicht kompatibel sind, also muss man es umwandeln:
Delphi-Quellcode:
ShellExecute(0, nil, 'cmd.exe', PChar('Transfer_TNC155.bat "' + prog + '"'), nil, SW_SHOW);
Nebenbei wäre es auch noch sinnvoll den Rückgabewert auszuwerten um eine passende Fehlermeldung anzuzeigen, wenn die Batchdatei nicht gestartet werden konnte. |
AW: Parameter übergeben
Hmm..
Zitat:
es werden alle Parameter, also auch prog als Parameter von cmd.exe verwendet. Somit ist es nicht möglich einen Parameter als Parameter des aufzurufenden Progs mitzugeben. Mach einfach den direkten Aufruf deiner .bat:
Delphi-Quellcode:
BAT und CMD werden von Windows automatisch mit CMD.EXE aufgerufen..
procedure TForm1.Button2Click(Sender: TObject);
var Batch : string; Para : string; begin Batch := ExtractFilePath(ParamStr(0)) + 'Test.bat'; Para :='"HALLO"'; ShellExecute(Application.Handle, nil, PChar(Batch), PChar(Para), nil, SW_SHOW); end; |
AW: Parameter übergeben
Zitat:
Delphi-Quellcode:
ShellExecute(0, nil, 'cmd.exe', PChar('/C Transfer_TNC155.bat "' + prog + '"'), nil, SW_SHOW);
Dass da der Parameter für die Befehlszeile fehlte, hatte ich übersehen. Aber der direkte Aufruf macht natürlich mehr Sinn, ich wollte das nur ohne weitere Änderungen korrigieren. |
AW: Parameter übergeben
Und bezüglich dem relativen Pfad ... das sollte besser auch gleich repariert werden.
|
AW: Parameter übergeben
Vielen Dank für Eure Ratschläge. Leider erhielt ich aber nicht den gewünschten Erfolg.
Ich habe nun eine andere Lösung, nicht so elegant, aber die klappt. mein Delphi-Programm: procedure TForm3.Button3Click(Sender: TObject); const FN = 'C:\HDH\Prog.dat'; var prog : String; TextDatei: TextFile; begin Prog:= Form1.Programm; ShowMessage(prog); AssignFile(TextDatei, FN); Rewrite(TextDatei); Write(TextDatei, Prog); CloseFile(TextDatei); ShellExecute(0, nil,'cmd.exe', '/k C:\HDH\Transfer_TNC155.bat', nil, SW_SHOW); end; und hier mein Batch-File: Echo off CD\ if exist c:\HDH\99.txt del /Q c:\HDH\99.txt SET file=C:\hdh\prog.dat IF EXIST "%file%" GOTO Erstellen IF NOT EXIST "%file%" GOTO Error :Erstellen FOR /f "delims=" %%f IN (%file%) DO ( Echo %%f SET str=%%f copy /Y C:\HDH\TNC155\%%f C:\HDH\99.txt ) GOTO End :Error ECHO Datei existiert nicht GOTO End :End exit |
AW: Parameter übergeben
Warum kopierst Du nicht selber sondern gehst über ne Batch Datei?
Hier ein Beispiel:
Delphi-Quellcode:
Ps: setz mal Deinen Code in [ DELPHI] hier der Code [ /DELPHI], dann schauts schöner aus.
procedure TForm4.Button1Click(Sender: TObject);
var f: TSearchRec; Dir: string; begin if not SelectDirectory(Dir,widestring(Dir),Dir) then Exit; // Quell-Verzeichnis FileMode:=0; if FindFirst(Dir+'\*.*',faAnyFile,f) = 0 then repeat try if (f.Attr and faDirectory ) < $00000008 then CopyFile(PChar(Dir+'\'+f.Name),PChar ('C:\Users\Tool\Desktop\test\new\'+f.Name),false); // Ziel-Verzeichnis except on e: exception do ShowMessage(E.Message); end; until findNext(f) <> 0 end; |
AW: Parameter übergeben
viele CopyFile oder ein
![]() Zitat:
Also dein Programm weiß davon nichts. PS: Rate mal, warum viele Funktionen ein Result besitzen, was man sogar auswerten kann? :zwinker: Und dein
Delphi-Quellcode:
ist auch nicht hilfreich, da niemand das innerhalb der Millisekunde lesen kann, bevor es wieder weg ist.
ECHO Datei existiert nicht
Jupp, [DELPHI]...[/DELPHI] oder auch nur [CODE]..[/CODE] drumrum macht alles gleich viel besser lesbar |
AW: Parameter übergeben
Die Frage, die ich mir gerade stelle, ist, wenn jemand ein Programm schreibt um eine Batchdatei zu starten und auch auf dessen Result reagieren möchte (Und da könnten ja auch die unterschiedlichsten Fehler auftreten: Fehlende Verzeichnisse, Fehlende Rechte, Überschreiben (Ja/Nein), usw), warum schreibt er dann das, was die Batchdatei macht, nicht gleich in Delphi? Da könnte man doch noch eleganter und informativer auf Fehler/Ereignisse reagieren?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz