Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Shell execute (https://www.delphipraxis.net/202253-shell-execute.html)

DomPerle 14. Okt 2019 13:50

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

Dalai 14. Okt 2019 14:02

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 Delphi-Referenz durchsuchenFormat ist übrigens sehr hilfreich beim formatierten Verketten von Variablen.

Unabhängig davon lassen sich mit Delphi auch ohne Hilfe der CMD Dateien kopieren (z.B. CopyFile(Ex)).

Grüße
Dalai

DomPerle 14. Okt 2019 14:40

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.

Dalai 14. Okt 2019 15:05

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:
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);
Grüße
Dalai

DomPerle 15. Okt 2019 06:35

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'

jaenicke 15. Okt 2019 06:44

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);

Moombas 15. Okt 2019 07:51

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?

Dalai 15. Okt 2019 14:22

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 Delphi-Referenz durchsuchenIncludeTrailingPathDelimiter durch Delphi-Referenz durchsuchenIncludeTrailingBackslash ersetzen. Oder du lässt den Aufruf dieser Funktion weg und setzt die Backslashes/Pfadtrenner direkt im String. Eigentlich macht man letzteres aber nicht, denn Code sollte plattformunabhängig sein - ja, ich weiß, in meinem Beispiel ist auch noch ein Backslash enthalten, und die CMD gibt's auch nur unter Windows ... Aber das ist noch ein Grund, sich gegen die Kopiererei mittels CMD zu entscheiden, weil man das direkt mit Delphi machen kann.

Grüße
Dalai

KodeZwerg 15. Okt 2019 15:05

AW: Shell execute
 
Hier im Forum gefunden.
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;

DomPerle 16. Okt 2019 10:36

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 23:01 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