AGB  ·  Datenschutz  ·  Impressum  







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

CMD über ShellExecute

Ein Thema von SaFu · begonnen am 10. Feb 2021 · letzter Beitrag vom 11. Feb 2021
Antwort Antwort
Benutzerbild von SaFu
SaFu

Registriert seit: 8. Nov 2006
1.360 Beiträge
 
Delphi 10.3 Rio
 
#1

CMD über ShellExecute

  Alt 10. Feb 2021, 18:10
Hallo,

ich versuche Dateien die alter sind als X Tage über CMD zu löschen mit folgenden Code

Code:
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;
Über CMD und einer Batchdatei funktioniert es wie es soll aber warum nicht so?

Würde ungern den umweg über eine Batchdatei gehen.

LG
"... Wie gesagt, die Nutzer von 10, 12, 14 Zoll Display's werden deine Seite nicht in voller Pracht sehen können, ...

Surft Ihr mit dem Taschenrechner?"
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

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

AW: CMD über ShellExecute

  Alt 10. Feb 2021, 18:31
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

Geändert von Dalai (11. Feb 2021 um 11:24 Uhr) Grund: Typo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.064 Beiträge
 
Delphi 12 Athens
 
#3

AW: CMD über ShellExecute

  Alt 10. Feb 2021, 18:47
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 cmd /? .

Und für die CMD.exe gibt es sogar eine Umgebungsvariable mit dem kompletten Pfad.
%ComSpec% = C:\Windows\system32\cmd.exe

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. Delphi-Referenz durchsuchenTDirectory.GetFiles
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);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (11. Feb 2021 um 11:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

AW: CMD über ShellExecute

  Alt 11. Feb 2021, 06:56
Moin...

...und das von mir aus im Thread oder Timer. Fertsch.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#5

AW: CMD über ShellExecute

  Alt 11. Feb 2021, 15:10
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.

https://docs.microsoft.com/en-us/win...-shellexecutea

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:
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;
Das ForFiles eine Programm ist, könnte aber dashier schon ausreichend sein:
Delphi-Quellcode:
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;
Und natürlich: Solange es nicht funktioniert nicht SW_Hide verwenden, sondern SW_Normal, damit man ggfls. Meldungen auf der Konsole sehen kann.

Geändert von Delphi.Narium (11. Feb 2021 um 17:41 Uhr) Grund: Shreibfehler behoben
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.064 Beiträge
 
Delphi 12 Athens
 
#6

AW: CMD über ShellExecute

  Alt 11. Feb 2021, 17:12
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" https://docs.microsoft.com/de-de/win.../xcopy#remarks

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.
https://www.dostips.com/forum/viewtopic.php?t=3702
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  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 20:27 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