AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Shell execute

Ein Thema von DomPerle · begonnen am 14. Okt 2019 · letzter Beitrag vom 16. Okt 2019
Antwort Antwort
DomPerle

Registriert seit: 26. Apr 2017
20 Beiträge
 
#1

Shell execute

  Alt 14. Okt 2019, 14:50
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
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: Shell execute

  Alt 14. Okt 2019, 15:02
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

Geändert von Dalai (14. Okt 2019 um 15:04 Uhr)
  Mit Zitat antworten Zitat
DomPerle

Registriert seit: 26. Apr 2017
20 Beiträge
 
#3

AW: Shell execute

  Alt 14. Okt 2019, 15:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#4

AW: Shell execute

  Alt 14. Okt 2019, 16:05
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
  Mit Zitat antworten Zitat
DomPerle

Registriert seit: 26. Apr 2017
20 Beiträge
 
#5

AW: Shell execute

  Alt 15. Okt 2019, 07:35
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'
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Shell execute

  Alt 15. Okt 2019, 07:44
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):
ShellExecute(0, nil, 'cmd.exe', PChar(Format('/k copy "%s" "%s"', [Prog, Ziel])), nil, SW_SHOW);
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Shell execute

  Alt 15. Okt 2019, 08:51
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?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#8

AW: Shell execute

  Alt 15. Okt 2019, 15:22
Ups, ich hab wohl in letzter Zeit zuviel AutoIt geschrieben . 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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Shell execute

  Alt 15. Okt 2019, 16:05
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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
DomPerle

Registriert seit: 26. Apr 2017
20 Beiträge
 
#10

AW: Shell execute

  Alt 16. Okt 2019, 11:36
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
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 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