Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst SET in FORFILES geht nicht

Mitglied: fmerst

fmerst (Level 1) - Jetzt verbinden

06.06.2009, aktualisiert 19:33 Uhr, 6275 Aufrufe, 3 Kommentare

Hallo zusammen,
möchte mit Batch die älteste (bzw. neuste) Datei innerhalb eines Pfades (Directory samt Unterverzeichnissen) ermitteln

Da die Erstellungszeit einer Datei im Format TT.MM.JJJJ abgelegt ist taugt sie nicht zum sortieren.
Ich wandle deshalb das Erstellungsdatum mit einer FOR-Schleife um, so dass es die Form JJJJ.MM.TT hat.
Diese Umwandlung soll für alle Dateien, die mittels FORFILES ermittelt werden, durchgeführt werden. Gleichzeitig soll dabei mittels eines IF Konstruktes geprüft werden, ob das aktuell umgewandelte Datum das älteste ist.
Der Vergleich soll über die (Umgebungs)Variable > xold < erfolgen.

Der komplette Befehl steht in einem Batchfile und sieht wie folgt aus:

setlocal enabledelayedexpansion
rem initialisierung des ältesten Datums
set xold="20101231"
forfiles /P "C:\temp" /S /C "cmd /c for /F 0x22 tokens=1,2,3 delims=.0x22 %%a in (0x22@fdate0x22) do if 0x22%%c%%b%%a0x22 lss 0x22!xold!0x22 (set xold=%%c%%b%%a) else (echo WarNix)"
echo aeltestes Datum ist %xold%
rem falls wegen verzögerter Auflösung erforderlich:
echo aeltestes Datum ist !xold!

Es funktioniert auch alles, bis auf den Teil > set xold=%%c%%b%%a < . Alle Versuche was mit SET in die Variable > xold < zu packen sind wirkungslos.
Steht anstelle des SET im WAHR-Teil des IF-Konstruktes ein > echo japp <, so wird -je nach jeweilgen Datum der aktuell bearbeiteten Datei- das > japp < ausgegeben.


Hier noch paar kurze Anmerkungen zum Aufbau
- Datumswerte habe ich zur Unterscheidung von Zahlen in Hochkomma gesetzt.
Grund Gefahr mit Verwechslung von Dezimalzahlen und Oktalzahlen (die Präfix 0 haben). Ist 09 Dezimal der 9.te Tag oder die Oktalzahl 09 (die unzulässig wäre, da Oktal ja nur bis 8 geht)

- FOR Schleife zum Datumssort lautet in Einfachform:
for /F "tokens=1,2,3 delims=." %%a in ("%date%") do set old=%%c%%b%%a
Da sie hier aber im Befehlsteil des FORFILES commands steht, welcher in Hochkomma gesetzt sein muss, können keine Hochkommas verwendet werden.
Diese wurden daher durch das 0x22 (HexWert für ") ersetzt.
Das %date% wurde durch die Datumsfunktion des FORFILES, also @fdate, ersetzt

- Verzögerte Auflösung der Umgebungsvariablen
Hier habe ich bereits gesetzt : setlocal enabledelayedexpansion
Den Vergleich mit dem Wert der Variablen >xold <, die ja in Schleifen nur beim Einlesen aufgelöst wird, habe ich daher mit dem empfohlenen !xold! statt %xold% durchgeführt.
Der IF / ELSE Teil wird ja auch korrekt erkannt.

- Filename @File und Pfad @PATH könnten, ist erst mal das älteste Datum in der Variablen, sicher leicht zugefügt werden.


Also wäre sehr schön, wenn jemand sagen könnte wie man den SET dazu bringen könnte das älteste Datum aufzunehmen,
ODER: Vielleicht hilft ja auch ein total neuer Gedankenansatz!

Vielen Dank für Eure Hilfe!
Franz
Mitglied: bastla
07.06.2009 um 00:24 Uhr
Hallo fmerst und willkommen im Forum!

Versuch es mal so:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Basis=C:\Temp" 
03.
 
04.
set "xold=99999999" 
05.
set "fold=" 
06.
for /f "delims=" %%i in ('dir /s /b /a-d "%Basis%"') do ( 
07.
    set "D=%%~ti" 
08.
    set "D=!D:~6,4!!D:~3,2!!D:~,2!" 
09.
    if !D! lss !xold! ( 
10.
        set "xold=!D!" 
11.
        set "fold=%%i" 
12.
13.
14.
echo aelteste Datei: %xold:~6,2%.%xold:~4,2%.%xold:~,4% %fold%
Einschränkung: Gefunden wird die erste Datei mit dem ältesten Datum, die Uhrzeit wird ignoriert.

Voraussetzung ist, dass Jahreszahlen 4-stellig ausgegeben werden.

Grüße
bastla
Bitte warten ..
Mitglied: fmerst
07.06.2009 um 20:42 Uhr
Hallo bastla,

ein richtig dickes Danke für
- den netten Willkommensgruß
- die rasend schnelle Beantwortung
- die super Lösung die Du geliefert hast

Hat 'nen bissle gedauert bis ich jetzt anworten konnte - wollte mir verinnerlichen was da steht.
Also: es funktioniert PRIMA!! Hab mir fast schon gedacht, dass ein anderer Lösungsansatz helfen könnte.

Dass man in der For-Schleife als "Datei" auch einen kompletten Befehl reinpacken kann ist echt abgefahren. Da muss man erst mal drauf kommen.
Oder die Hilfe lesen ---> und wissen wie man's anwenden kann

--- Schnipsel aus FOR /? ----------------
Schließlich können Sie den Befehl FOR /F auch verwenden, um die Ausgabe
eines Befehls auszuwerten. Dazu geben Sie eine Zeichenfolge in einfachen
Anführungszeichen als Dateiensatz zwischen den Klammern an. Diese
Zeichenfolge wird dabei als Befehlszeile betrachtet und von einer unter-
geordneten CMD.EXE ausgeführt. Die Ausgabe dieses Befehls wird dann wie
eine normale Datei ausgewertet.
--- End of Schnipsel ----------------------

Beim Testen habe ich einen klitzekleinen Wermutstropfen entdeckt:
manche Dateien haben kein -für die Batch lesbares- Datum.
Suchen hat ergeben, dass es sich hierbei um die Dateien handelt, die Windows beim Speichern einer Webseite als zur Webseite zugehörige Seiten in dem speziellen Ordner "<Name der Webseite> - Dateien" abspeichert.

Aber damit kann man leicht leben. Ich habe sie rausgefiltert mit dieser kleinen Erweiterung:
if not "%%~ti"=="" ( if !D! lss !xold! ( set "xold=!D!" & set "fold=%%i" ) ) else (echo Fehler bei %%i Datum "%%~ti" ist falsch >> %logfile%)

Nochmals: BESTEN DANK
und einen schönen Tag noch,

Franz
Bitte warten ..
Mitglied: bastla
07.06.2009 um 20:48 Uhr
Hallo Franz!

Danke für's "Danke".

Freut mich, dass mein Ansatz für Dich nützlich war.

Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch: SET geht nicht?!
gelöst Frage von SlainteMhathBatch & Shell3 Kommentare

Moin, ich steh gerade auf dem Schlauch bei einer Batch (unter Windows 7) Mein Code ergibt erwarten würde ich ...

Windows Server
Forfiles findet nicht alles
gelöst Frage von DerVolkerWindows Server15 Kommentare

Hallo zusammen, ich suche auf einem Netzwerklaufwerk nach alten Dateien: forfiles /P PFAD /D -01.01.2013 /S Somit finde ich ...

Windows Server

Forfiles Command löscht nicht richtig

Frage von jojo0411Windows Server2 Kommentare

Hallo Leute, Ich nutze seit ein paar Tagen folgenden Befehl zum löschen von Dateien die älter sind als 3 ...

Windows Tools

MS Tool "forfiles"

Frage von emeriksWindows Tools3 Kommentare

Hi, verstehe ich es bloß nicht oder ist die Option "/D +dd" des MS Tools "forfiles" total sinnfrei? /DDatumWählt ...

Neue Wissensbeiträge
Humor (lol)
IoT-Gefahr: Smartes Aquarium leckt!
Information von Lochkartenstanzer vor 1 TagHumor (lol)3 Kommentare

Moin, Die IoT-Manie hat weitere Opfer gefunden. Ein Casino-Leck durch ein smartes Aquarium: Allerdings haben sie kein Wasser, sondern ...

Router & Routing

Alte Fritzbox 7270 mit VPN und SIP-Telefonie hinter O2 Homebox 6641 als "Modem"

Erfahrungsbericht von the-buccaneer vor 1 TagRouter & Routing3 Kommentare

Nun war es soweit: Auch O2 hat mich mit VOIP zwangsbeglückt. Heute am Privatanschluss, in 2 Wochen ist das ...

Sicherheit

Ungepatchte Remote Code Execution-Lücke in LG NAS

Information von kgborn vor 2 TagenSicherheit

Nutzt wer LG NAS-Einheiten? In den NAS-Einheiten der LG Network Storage-Einheiten gibt es eine sehr unschöne Schwachstelle, die einen ...

Windows Update

Neue Version KB4099950 NIC Einstellungen gehen verloren

Information von sabines vor 2 TagenWindows Update2 Kommentare

Es ist eine neue Version des KB4099950 verfügbar, die das Problem mit den verlorenen Netzwerkeinstellungen lösen soll. Das Datum ...

Heiß diskutierte Inhalte
Router & Routing
Mikrotik: Routing zwischen Interfaces mit Geräten ohne Gateway
Frage von TonLichtVideoRouter & Routing18 Kommentare

Hallo zusammen, ich komme aus dem Veranstaltungstechnik Bereich und habe zwei Netze um verschiedene Hardware zu Remoten. CONTROL1 192.168.1.0/24 ...

Linux Netzwerk
Raspberry Pi 3: WLAN Power save deaktivieren
Frage von nordie92Linux Netzwerk14 Kommentare

Moin moin, mein Raspberry Pi 3 Model B benötigt eine dauerhaft aktive WLAN-Verbindung. Leider bricht die WLAN-Verbindung nach einigen ...

SAN, NAS, DAS
Entscheidung SAN Dell oder HP
Frage von VincorSAN, NAS, DAS13 Kommentare

Hallo, wir wollen uns für unsere Hyper V Umgebung eine neue SAN Anschaffen. Es laufen 30 VM's darunter, DC; ...

Vmware
Server 2008 r2 vmware terminalserver
Frage von MasterCVmware10 Kommentare

Guten Abend zusammen, ich hoffe , dass einer von euch mir weiterhelfen kann ,bei meinem kack Problem ! Ist ...