![]() |
CMD über ShellExecute
Hallo,
ich versuche Dateien die alter sind als X Tage über CMD zu löschen mit folgenden Code
Code:
Über CMD und einer Batchdatei funktioniert es wie es soll aber warum nicht so?
procedure TForm1.Button1Click(Sender: TObject);
begin ShellExecute(handle,'open','cmd.exe','ForFiles /p "C:\Users\NAME\Desktop\Test" /s /m *.* /d -60 /c "cmd /c del @file"',nil,SW_hide); end; Würde ungern den umweg über eine Batchdatei gehen. LG |
AW: CMD über ShellExecute
forfiles ist eine EXE, daher kann man das direkt aufrufen. Oder kurz: Lass den Umweg über die cmd.exe weg. Und achte auf korrektes Quoting.
Oder programmiere das direkt in Delphi, denn Dateien älter X Tage zu finden und zu löschen, sollte ziemlich einfach zu implementieren sein. PS: Noch ein Tipp: SW_HIDE sollte man bei Problemen erstmal wegnehmen bzw. durch SW_SHOW ersetzen, damit man sieht, was und wo es genau klemmt. Grüße Dalai |
AW: CMD über ShellExecute
CMD will auch einen Parameter, mit dem DU ihm sagen mußt, dass der nachfolgende Text als Befehl ausgeführt werden soll.
Siehe /C oder /K in
Delphi-Quellcode:
.
cmd /?
Und für die CMD.exe gibt es sogar eine Umgebungsvariable mit dem kompletten Pfad.
Delphi-Quellcode:
= C:\Windows\system32\cmd.exe
%ComSpec%
Aber wie Dalai bereits erwähnte, ist für die FOREFILES.exe das CMD garnicht nötig. Joar, in Delphi gibt es viele Möglichkeiten. z.B. ![]() Ich denke mal Lazarus wird bestimmt auch irgendwo eine "einfache" Datei-Such-API bieten.
Delphi-Quellcode:
uses
IOUtils, DateUtils; var Files: TArray<string>; begin Files := TDirectory.GetFiles('C:\Users\NAME\Desktop\Test', TSearchOption.soAllDirectories, function(const Path: string; const SearchRec: TSearchRec): Boolean begin Result := SearchRec.TimeStamp <= IncDay(Now, -60); end); for var F in Files do TFile.Delete(F); // oder wenn man etwas "böse" ist TDirectory.GetFiles('C:\Users\NAME\Desktop\Test', TSearchOption.soAllDirectories, function(const Path: string; const SearchRec: TSearchRec): Boolean begin if SearchRec.TimeStamp <= IncDay(Now, -60) then TFile.Delete(TPath.Combine(Path, SearchRec.Name)); Result := False; end); |
AW: CMD über ShellExecute
Moin...:P
...und das von mir aus im Thread oder Timer. Fertsch. 8-) |
AW: CMD über ShellExecute
ShellExecute ist 'ne Funktion, eventuell mal deren Rückgabewert anschauen? Der kann sehr aufschlussreich sein.
Werte über 32 bedeuten, dass der Aufruf ok war, alles darunter deutet auf 'nen Fehler hin. ![]() Wenn ich Deinen ShellExecuteaufruf richtig interpretiere, startet der eine CMD.exe die ForFiles startet, damit dieses für jede passende Datei eine CMD.exe startet, die dann für die angegebene Datei ein DEL ausführt. Bei Deiner Art CMD.exe aufzurufen fehlt noch der Parameter /c, damit sich CMD.exe nach dem Ausführen von ForFiles beendet. (Keine Ahnung, ob ShellExecute wartet, bis CMD.exe fertig ist, wenn ja, dann wäre das ein möglicher Grund für das "Nichtfunktionieren".)
Delphi-Quellcode:
Das ForFiles eine Programm ist, könnte aber dashier schon ausreichend sein:
var
iResult : Integer; begin iResult := ShellExecute(handle,'open','cmd.exe','/c ForFiles /p "C:\Users\NAME\Desktop\Test" /s /m *.* /d -60 /c "cmd /c del @file"',nil,SW_hide); if iResult < 33 then begin ShowMessage(IntToStr(iResult)); // Oder sonstwie auf den Rückgabewert von ShellExecute reagieren. end; end;
Delphi-Quellcode:
Und natürlich: Solange es nicht funktioniert nicht SW_Hide verwenden, sondern SW_Normal, damit man ggfls. Meldungen auf der Konsole sehen kann.
var
iResult : Integer; begin iResult := ShellExecute(0,nil,'ForFiles','/p "C:\Users\NAME\Desktop\Test" /s /m *.* /d -60 /c "cmd /c del @file"',nil,SW_hide); if iResult < 33 then begin ShowMessage(IntToStr(iResult)); // Oder sonstwie auf den Rückgabewert von ShellExecute reagieren. end; end; |
AW: CMD über ShellExecute
Mit CreateProcess statt ShellExecute bekommt man von der forfiles.exe EXE sogar den richtigen ExitCode (ErrorLevel).
Viele Programme geben ja ein passendes "Result" zurück. z.B. siehe XCOPY, am Ende der "Hinweise" ![]() Forfiles selber scheint keine Codes zu liefern (komisch, hätte gedacht, das es z.B. bei einem falschen Pfad, oder wenn nichts gefunden, etwas dazu sagen würde), aber das was es dann ausführt, das kann/wird wohl dann den ExitCode setzen. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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