Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ShellExecute führt den Befehl nicht aus (https://www.delphipraxis.net/180945-shellexecute-fuehrt-den-befehl-nicht-aus.html)

HPB 2. Jul 2014 11:17

ShellExecute führt den Befehl nicht aus
 
Guten Tag Delphianer,
ich möchte mit folgendem Code eine Datei kopieren:
Delphi-Quellcode:
  ShellExecute(Handle, 'open', PChar(FPfadPDFAblage + '\pdfrechnung-kopie.bat'),
  nil, nil, SW_SHOW);
Inhalt der BAT-Datei:
Copy unbenannt.pdf D:\Entwicklungen\BPSWAWI\Buero4\Rechnungen\RE-14553-vom-02-07-2014.pdf

Wenn ich mit einem Doppelklick auf die Bat-Datei klicke, wird die Datei kopiert.
Lasse ich obigen Code ausführen, wird die Datei nicht kopiert.
Woran mag dies wohl liegen??
Vielen Dank für Hilfestellungen im voraus.
Mit Gruß
HPB

himitsu 2. Jul 2014 11:25

AW: ShellExecute führt den Befehl nicht aus
 
Wo?
  • Diese API hat einen Rückgabewert, den man eventuell mal auswerten sollte. Dann hat der COPY-Befehl einen Rückgabewert "ErrorLevel", welchen man auswerten sollte.
  • Dieser API kann/sollte man das Arbeitsverzeichnis mitgeben, vorallem wenn in dem Aufruf irgenwo mir relativen Pfaden gearbeitet wird. :roll:
  • Und wozu wird eine Batch aufgerufen, um die Datei zu kopieren, anstatt direkt zu kopieren und dabei nur einen Rückgabewert prüfen zu müssen?
  • Oder kann man die PDF nicht gleich unter dem richtigen Namen speichern?

PS: Der Explorer ist schlauer. Er verwendet letztendlich auch auch nur sowas, wie das ShellExecute, nur ist der so intelligent und übergibt das aktuelle Verzeichnis als Arbeitsverzeichnis. :stupid:

mkinzler 2. Jul 2014 11:28

AW: ShellExecute führt den Befehl nicht aus
 
Steht in FPfadPDFAblage auch der absolute Pfad?

HPB 2. Jul 2014 13:48

AW: ShellExecute führt den Befehl nicht aus
 
Zitat:

Zitat von himitsu (Beitrag 1264088)
Wo?
  • Diese API hat einen Rückgabewert, den man eventuell mal auswerten sollte. Dann hat der COPY-Befehl einen Rückgabewert "ErrorLevel", welchen man auswerten sollte.
  • Dieser API kann/sollte man das Arbeitsverzeichnis mitgeben, vorallem wenn in dem Aufruf irgenwo mir relativen Pfaden gearbeitet wird. :roll:
  • Und wozu wird eine Batch aufgerufen, um die Datei zu kopieren, anstatt direkt zu kopieren und dabei nur einen Rückgabewert prüfen zu müssen?
  • Oder kann man die PDF nicht gleich unter dem richtigen Namen speichern?

PS: Der Explorer ist schlauer. Er verwendet letztendlich auch auch nur sowas, wie das ShellExecute, nur ist der so intelligent und übergibt das aktuelle Verzeichnis als Arbeitsverzeichnis. :stupid:

Danke himitsu für Deine Ausführungen.
Nein, die PDF-Datei kann nicht sofort unter dem richtigen Namen gespeichert werden. Sie wird aus der pdfFactory erzeugt.
Alles Weitere werde ich noch prüfen müssen.
Mit Gruß
HPB

HPB 2. Jul 2014 13:49

AW: ShellExecute führt den Befehl nicht aus
 
Zitat:

Zitat von mkinzler (Beitrag 1264089)
Steht in FPfadPDFAblage auch der absolute Pfad?

Guten Tag mkinzler,
ja in der Variable steht auch der der absolute Pfad.
Mit Gruß
HPB

DeddyH 2. Jul 2014 13:52

AW: ShellExecute führt den Befehl nicht aus
 
Was gibt ShellExecute denn zurück?

baumina 2. Jul 2014 14:01

AW: ShellExecute führt den Befehl nicht aus
 
Meiner Meinung nach fehlt in der Batchdatei einfach nur der Pfad wo die Datei unbenannt.pdf zu finden ist. Führt man die Batchdatei da aus wo sich diese unbenannt.pdf-Datei befindet, geht das natürlich, da man zuvor in das Verzeichnis wechselt. Der Verzeichniswechsel wird allerdings nicht im ShellExecute gemacht. Deswegen:

Copy [um PFAD ergänzen]unbenannt.pdf D:\Entwicklungen\BPSWAWI\Buero4\Rechnungen\RE-14553-vom-02-07-2014.pdf

himitsu 2. Jul 2014 14:16

AW: ShellExecute führt den Befehl nicht aus
 
Ich weiß jetzt leider nicht, ob CMD den letzten ErrorLevel des letzten Befehls als eigenen ExitCode rausgibt.

Code:
COPY /V %von% %nach%
IF ERRORLEVEL 1   EXIT %ERRORLEVEL%


COPY /V %von% %nach%
IF %ERRORLEVEL% GTR 0   EXIT %ERRORLEVEL%
Das Exit setzt auf jeden Fall (sollte zumindestens) den ExitCode der CMD.exe
und wenn man mag, dann kann man via /V dem Copy sagen, es solle die Datei nach dem Schreiben nochmal prüfen.

Aber am Ende läuft es doch auf Folgendes hinaus
Delphi-Quellcode:
Status := ShellExecute(Handle, nil, '%ComSpec%', PChar('/C "COPY mitPfad/unbenannt.pdf D:\Entwicklungen\BPSWAWI\Buero4\Rechnungen\RE-14553-vom-02-07-2014.pdf"'), nil, SW_SHOW);

Status := ShellExecute(Handle, nil, '%ComSpec%', PChar('/C "COPY unbenannt.pdf D:\Entwicklungen\BPSWAWI\Buero4\Rechnungen\RE-14553-vom-02-07-2014.pdf"'), PChar(derPfad), SW_SHOW);

// k.A. ob jetzt %ComSpec% aufgelöst wird, oder halt einfach 'cmd.exe' nutzen, eventuell mit dem System32-Verzeichnis davor
und da frag ich mich, warum man dort nicht einfach RenameFile (SysUtils) oder CopyFile (Windws) verwenden sollte, oder besser noch eine der neuen Implementationen aus der IOUtils.
http://docwiki.embarcadero.com/CodeE...s_%28Delphi%29


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 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