![]() |
Shell execute
Hallo zusammen,
was muß ich tun, damit dieser Befehl richtig ausgeführt wird. prog := copy(Form1.Programm,1,4); //Programm hat den Inhalt '15010000' also Prog = 1501 Ziel := 'C:\hdh\Transfer'; shellExecute(0, nil, 'cmd.exe', '/k copy prog ziel', nil, SW_SHOW); //Ergebnis: Datei nicht gefunden shellExecute(0, nil, 'cmd.exe', '/k copy C:\hdh\1501 C:\hdh\Transfer', nil, SW_SHOW); //OK Grüß domperle |
AW: Shell execute
Du musst den Pfad richtig zusammenbauen. Frage: Was kommt raus, wenn du 'C:\hdh\Transfer' und '1501' verkettest? Antwort: 'C:\hdh\Transfer1501'. Du willst aber offenbar etwas anderes, und außerdem willst du nicht 'prog ziel' als literale Strings haben. Die Funktion
![]() Unabhängig davon lassen sich mit Delphi auch ohne Hilfe der CMD Dateien kopieren (z.B. CopyFile(Ex)). Grüße Dalai |
AW: Shell execute
Du hast natürlich recht, der Code muß so aussehen.
Prog := 'C:\hdh\' + copy(Form1.Programm,1,4); //Programm hat den Inhalt 15010000 Prog = C:\hdh\1501 Ziel := 'C:\hdh\Transfer'; shellExecute(0, nil, 'cmd.exe', '/k copy prog ziel', nil, SW_SHOW); shellExecute(0, nil, 'cmd.exe', '/k copy C:\hdh\1501 C:\hdh\Transfer', nil, SW_SHOW); Quelle und Ziel des copy_Befehls sollen Variable sein, die ich durch Zuweisungen ändern kann. |
AW: Shell execute
Meine Variante wäre diese, auch wenn das mit Sicherheit noch verbesserungsfähig ist (aber unter den gegebenen Bedingungen wohl brauchbar):
Delphi-Quellcode:
Grüße
const cZiel = 'c:\hdh';
Prog := IncludeTrailingPathDelimiter(cZiel) + Copy(Form1.Programm,1,4); Ziel := IncludeTrailingPathDelimiter(cZiel) + 'Transfer\'; ShellExecute(0, nil, 'cmd.exe', Format('/k copy "%s" "%s"', Prog, Ziel), nil, SW_SHOW); Dalai |
AW: Shell execute
Jetzt hast Du mich kalt erwischt:
Meine Delphi-Kenntnisse reichen nicht aus,um Deinen Vorschlag korrekt einbauen zu können. Hier nochmal der jetzige Stand und die Fehlermeldung: procedure TForm3.Button3Click(Sender: TObject); const cZiel = 'c:\hdh'; var prog : String; Ziel : String; begin Prog := IncludeTrailingPathDelimiter(cZiel) + Copy(Form1.Programm,1,4); Ziel := IncludeTrailingPathDelimiter(cZiel) + 'Transfer\'; ShellExecute(0, nil, 'cmd.exe', Format('/k copy "%s" "%s"', Prog, Ziel), nil, SW_SHOW); MyShowMessage('Programmpaket im Verzeichnis ''C:\hdh\Transfer'' gespeichert', 12); End; Fehlermeldung: [Fehler] Konvert_Unit3.pas(116): Undefinierter Bezeichner: 'IncludeTrailingPathDelimiter' |
AW: Shell execute
Welche Delphiversion hast du denn? In der aktuellen (auch kostenlos erhältlichen) Version liegt die Funktion in der Unit System.SysUtils, die dann oben hinter uses in der Liste stehen muss.
Kompilieren wird das aber trotzdem nicht, denn ShellExecute erwartet einen PChar, keinen String, und hat auch andere Parameter als Dalai geschrieben hat (man beachte die eckigen Klammern):
Delphi-Quellcode:
ShellExecute(0, nil, 'cmd.exe', PChar(Format('/k copy "%s" "%s"', [Prog, Ziel])), nil, SW_SHOW);
|
AW: Shell execute
Ich würde hierbei dennoch gerne die "Frage" bzw. Hinweis von Dalai aufnehmen:
Wieso kopierst du über eine externe Batch, wenn Delphi das auch kann? |
AW: Shell execute
Ups, ich hab wohl in letzter Zeit zuviel AutoIt geschrieben :oops:. Dort gibt's bei der Funktion Format (bzw. StringFormat) keine eckigen Klammern für die Parameter.
@DomPerle: Wenn du ein älteres Delphi hast, kannst du auch ![]() ![]() Grüße Dalai |
AW: Shell execute
![]() Falls es auch was anderes als kopieren per cmd.exe sein darf.
Delphi-Quellcode:
function TForm1.SHCopyFile(Handle: THandle; szSource, szDestination: TFileName): Boolean;
var ShellFileOperation: TSHFileOpStruct; begin Result := True; try with ShellFileOperation do begin Wnd := Handle; wFunc := FO_COPY; pFrom := PChar(szSource); pTo := PChar(szDestination); // fFlags := FOF_FILESONLY OR FOF_NOCONFIRMMKDIR FOF_SIMPLEPROGRESS; fFlags := FOF_NOCONFIRMMKDIR; lpszProgressTitle := 'Dateien kopieren ...'; end; SHFileOperation(ShellFileOperation); except Result := False; end; end; procedure TForm1.StartBitBtnClick(Sender: TObject); begin if SHCopyFile(Handle, 'C:\Windows\*.*', 'D:\Windows.Copy\') then begin ShowMessage('Bingo ... und was funktioniert nicht?'); end; end; |
AW: Shell execute
Ich habe Delphi 5, das mir bisher für die kleinen Entwicklungen die ich mache vollkommen ausreicht. Ich benutze Delhi nur für Präsentationszwecke, also ListBox StringGrid Image etc.
Das eigentliche Programm, das die enzsprechenden Daten bereistellt, die in Delphi zur Anzeige kommen sollen schreibe ich in REXX. Dadurch umgehe ich den nervigen Formalismus von Pascal. Zunächst möchte ich mich bei allen bedanken, die mir Tips gegeben haben. Ich werde wohl doch den Vorschlag mit CopyFile versuchen, allerdings erhielt bei der Ausführung des Befehl die Meldung 'Zugriff verweigert' was daruaf hindeuten könnte, daß irgendeine der beiden Dateien nicht geclosed wurde.Nun suche ich erst einmal. Vielen Dank Domperle |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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 by Thomas Breitkreuz