beispiel.pas -> beispiel_d20250401_t120347.pas
Bisher per Hand bzw mit einer Mehrfachumbenenn-Funktion des Verwaltungsprogramms meiner Wahl, sozusagen ein Schweizer Offiziersmesser, mit dem ich 90% meiner täglichen Arbeiten unter Window erledige. Ich war das Mehrfachumbenennen leid bzw habe mich immer geärgert, daß dabei meine Quelle verloren ging, oder daß ich das Umbenennen in einem extra Ordner machen mußte oder andere Tricks oder einfach nur hinterher zurückkopieren.
Nach Auskunft des sehr rührigen und kompetenten Forums dort gibt es kein Mehrfachkopierenumbenennen oder wie auch immer man das nennen mag. Also habe ich mir selbst ein Script gebastet, versprochen war ja ich bekomme die Liste der ausgewählten Kandidaten (es ist wirklich eine Liste als temporäres File, ich dachte erst Wunder was). Nach einem kleinen Disput mit ChatGPT, das mehr hinderlich als nützlich war, dann mein stolzes Ergebnis:
Code: Alles auswählen
@echo off
setlocal enabledelayedexpansion
:: Datei-Liste aus Total Commander einlesen
for /f "delims=" %%F in (%1) do (
set "filepath=%%~fF" :: vollständiger Pfad der Datei
set "filename=%%~nF" :: Dateiname ohne Erweiterung
set "extension=%%~xF" :: Dateierweiterung
:: Pfad für WMIC vorbereiten (Backslashes verdoppeln für wmic)
set "filepath=!filepath:\=\\!"
:: Änderungsdatum abrufen
for /f "tokens=2 delims==" %%A in ('wmic datafile where name^="!filepath!" get LastModified /value') do (
set "timestamp=%%A"
)
:: Prüfen, ob der Timestamp gefüllt wurde
if not defined timestamp (
echo Fehler: Kein Zeitstempel für %%F gefunden!
pause
exit /b
)
:: Timestamp ins richtige Format bringen (_dYYYYMMDD_tHHMMSS)
set "timestamp=_d!timestamp:~0,8!_t!timestamp:~8,6!"
:: Datei mit neuem Namen kopieren
copy "!filepath!" "%%~dpF!filename!!timestamp!!extension!" > nul
)
Das wmic hat mir noch mehr Kopfzerbrechen bereitet und bald eine richtige Wut. Als ich es endlich hatte und das sogar unter Win7 und WinXP läuft (was will man mehr, entwickelt habe ich unter Win 10), war ich zufrieden. Bis die Zweifel kamen - gibt es denn da nix besseres für solche elementaren(?) Abfragen? Den letzten Stich versetzte mir dann noch die Meldung, daß wmic unter Win 11 angeblich nicht mehr da ist und man powershell nehmen soll. WTF?
Also beschloß ich, das kann ich doch auch selbst - Änderungsdatum bestimmen und ne Zeichenkette zurückgeben. Wozu hatte ich gerade das Touch nachgebaut?
Das Script kann das dann hoffentlich auswerten. Habe zwar bisher außer EXIT-Codes numerisch noch nie was anderes gemacht aber notfalls könnte man ja mit Writeln und Pipelines arbeiten?
Dann war mir das auch zu doof. wenn schon Programm, dann soll das auch gleich kopieren, und erstmals in meinem Leben springe ich mal über meinen Schatten und lasse Turbo-Pascal außen vor, weil das Zielsystem (TotalCommander) gibt es eh nur dort wo auch wenigsten FPC32 geht (Win XP minimal). Ich habe dann 2 Varianten gemacht, deren bessere ich hier auch gern zeige:
Code: Alles auswählen
program kopiere;
{$mode objfpc}
uses
Windows, SysUtils;
var
ListFile: TextFile;
FileName, NewFileName, NamePart, ExtPart: string;
FileTime: TDateTime;
SearchRec: TSearchRec;
begin
if ParamCount < 1 then begin
Writeln('Fehler: Keine Parameterliste übergeben.');
Halt(1);
end;
AssignFile(ListFile, ParamStr(1));
{$I-} Reset(ListFile); {$I+}
if IOResult <> 0 then begin
Writeln('Fehler: Kann Datei nicht öffnen: ', ParamStr(1));
Halt(1);
end;
while not EOF(ListFile) do begin
ReadLn(ListFile, FileName);
if FindFirst(FileName, faAnyFile, SearchRec) = 0 then begin
FileTime := FileDateToDateTime(SearchRec.Time);
NamePart := ChangeFileExt(FileName, '');
ExtPart := ExtractFileExt(FileName);
NewFileName := NamePart + '_d' + FormatDateTime('YYYYMMDD', FileTime) + '_t' + FormatDateTime('HHMMSS', FileTime) + ExtPart;
if CopyFile(PChar(AnsiString(FileName)), PChar(AnsiString(NewFileName)), False)
then Writeln('Kopiert: ', NewFileName)
else Writeln('Fehler beim Kopieren: ', FileName);
FindClose(SearchRec);
end
else Writeln(FileName, ' (Fehler: Datei nicht gefunden)');
end;
CloseFile(ListFile);
//Readln;
end.
Sonder- und Leerzeichen im Pfad und im Dateinamen lasse ich mal dahingestellt - das Script konnte zumindestens die Leerzeichen, hat aber irgendwie bei Sonderzeichen
wie ß und Komma gebockt (aber das hasse ich sowieso wie die Pest).
Natürlich ist das nur eine klitzekleine Funktion, aber für mich als Amateur war es ein ungeheures Aha-Erlebnis und eine Freude.... Außerdem kopiert die EXE viel schneller
als das Script, jedenfalls wenn es so ab 100 Einträge geht, ganz eindeutig.