batchanfaenger91
Goto Top

Batch: mit "dir" Befehl das neuste Lese- und Änderungsdatum auslesen

Hallo,

bin grad dabei ein Batch Skript zu schreiben komme aber nicht mehr weiter. Es hört sich für mich sehr kompliziert an. Ich versuche es mal in Worten zu fassen.


wenn ich den 'Dir' Befehl benutze und ein Pfad angebe bekomme ich auf der linken Seite das Datum raus. In der ersten Zeile steht immer das Hauptverzeichnis. Das lese ich zurzeit in mein Batch Skript aus.

Nun habe ich gemerkt, dass wenn ich in Unterverzeichnis oder z.B. in Unter-Unterordner etwas ändere wird mir trotzdem ein altes Datum angezeigt weil ich nicht selbst in Ordner eine Datei lese sondern im Unterordner.

Gibt es einen Befehl mit dem ich anhand einer For Schleife das neuste Datum rauslesen kann egal ob es im Hauptverzeichnis liegt oder in einem Unterordner? Damit will ich feststellen wann zuletzt in dem Ordner was geändert wurde oder ob auf ein txt Datei die im Unterordner liegt zugegriffen wurde.

Ich hoffe ihr habts verstanden was ich meine und könnt mir weiterhelfen.

Viele Grüße

BatchAnfaenger91

Content-Key: 283067

Url: https://administrator.de/contentid/283067

Printed on: April 18, 2024 at 12:04 o'clock

Mitglied: 114757
114757 Sep 16, 2015, updated at Sep 17, 2015 at 09:31:09 (UTC)
Goto Top
@echo off
set "ordner=C:\test"  
for %%r in ("%ordner%\.") do (  
	for /f "tokens=3,*" %%a in ('robocopy "%%~fr." "%%~fr." /l /nocopy /s /is /njh /njs /ndl /nc /ns /ts ^| sort /r ^| findstr /n "^" ^| findstr /l /b /c:"1:"') do set "latest=%%~tb"  
)
echo %latest%
Gruß jodel32

btw. geht sowas heutzutage wesentlich eleganter und in Echtzeit mit FileSystemWatchern etc. oder auch Eventlog und NTFS Überwachungseinträgen. Selbst mit Robocopy geht sowas in Echtzeit, und das alles mit Benachrichtigung ...
Suche eine Batch,Tool oder Programm zum umbenennen von Dateien
PDFs aus Ordner-Verzeichnis automatisch per Mail versenden
VBA - VBS : Umbennen und Verschieben von Dateien in Loop
Member: BatchAnfaenger91
BatchAnfaenger91 Sep 16, 2015 at 16:13:40 (UTC)
Goto Top
Hey

vielen Dank für deine Mühe Jodel32

ich dachte schon das ist es. dann habe ich in einem Unterordner von C:\Ordner eine neue txt file angelegt.
Der Unterordner war schon vorhanden. Txt File habe ich neu erstellt und beschrieben.

als ich dann die bat datei ausgeführt habe hat er mir trotzdem die Zeit ausgegeben, die zuletzt im C:\Ordner betimmt wurde also die Zeit wo ich die bat datei erstellt habe.

kannst du vielleicht sagen woran es liegen kann ?

Gruß

BatchAnfaenger91
Mitglied: 114757
114757 Sep 16, 2015, updated at Sep 17, 2015 at 09:18:41 (UTC)
Goto Top
Kann ich nicht bestätigen macht hier überall was es soll ... da musst du es falsch angepasst haben.

Ansonsten macht es das was du beschrieben hast. Bitte beachte das auf einem System das LastAccess Date deaktiviert sein kann, dann erhältst du falsche Werte wenn du nach LastAccess sortierst. Gerade bei Systemen mit SSDs wird das gerne deaktiviert.
Member: BatchAnfaenger91
BatchAnfaenger91 Sep 16, 2015 at 19:40:44 (UTC)
Goto Top
Hallo

Danke für den Hinweis. Ich probiere es morgen früh gleich mal aus und melde mich

Gruß
Member: BatchAnfaenger91
BatchAnfaenger91 Sep 17, 2015 at 08:25:27 (UTC)
Goto Top
Guten Morgen

ich habe deinen Ansatz ausprobiert. Habe immernoch das gleich Problem. Ich versuchs nochmal besser darzustellen

Ordner:C:\Test
time.bat
hallo.txt
lebenslauf.docs

Ordner:C:\Test\meinTest
meintest.txt
deintest.txt


also im Ordner C:\Test befindet sich die bat file. Da habe ich den Code den du oben angegeben hast eingefügt
Jetzt ändere ich 'meintest.txt' in C:\Test\meinTest und speichere die neu ab.

wenn ich die time.bat um 09.30 erstellt habe und die Datei 'meintest.txt' um 09.35 Uhr überschreibe zeigt trotzdem "Latest file change: 09:30 Uhr" natürlich noch mit Datum vorne dran.

ich will es aber so weit bringen das ein Befehl alle Verzeichnisse rekursiv sucht und am Ende mir das Ergebnis indem Fall 09:35 Uhr ausliefert.

Ich hoffe ich konnte mein Problem besser schildern face-smile

Gruß

BatchAnfaenger91
Mitglied: 114757
114757 Sep 17, 2015 at 09:30:15 (UTC)
Goto Top
Ach so, habs oben angepasst...

Gruß jodel32
Member: BatchAnfaenger91
BatchAnfaenger91 Sep 17, 2015 at 12:47:50 (UTC)
Goto Top
Hey jodel32,

danke das ist genau das was ich gesucht habe. vielen Dank

nur habe ich mir gedacht das ich daraus einfach weiter arbeiten kann

über den 'wmic share get name und pfad' will ich den pfad als variable setzen

es sieht zurzeit bei mir so aus


(for /f "skip=4 tokens=1,2,3 delims=," %%a in ('wmic share get Name^,Path /format: csv ^|findstr "."') DO @ (  
	set "file=%%c"  
	for %%r in ("%file%\.") do (  
	for /f "tokens=3,*" %%a in ('robocopy "%%~fr." "%%~fr." /l /nocopy /s /is /njh /njs /ndl /nc /ns /ts ^| sort /r ^| findstr /n "^" ^| findstr /l /b /c:"1:"') do set "latest=%%~tb"  
	)	
	echo "%%b";"%%c";"%latest%"  



Doch leider tut er nicht das was ich brauche. das Programm bleibt meistens in der Konsole hängen und führt es nicht aus.

an was kann das liegen?

Viele Grüße
Mitglied: 114757
Solution 114757 Sep 17, 2015, updated at Sep 22, 2015 at 07:02:50 (UTC)
Goto Top
an was kann das liegen?
Erstens weil in der Liste der Shares meist auch Shares wie Druckershares dabei sein können, die keinen "richtigen" Pfad enthalten können (du musst diese also ausfiltern) und zweitens weil der Pfad mit einem Backslash endet den du hier in Zeile 3 doppelt hast. Drittens weil du kein delayedexpansion nutzt was du brauchst wenn du Variablen innerhalb einer FOR-Schleife definierst und darauf zugreifst.

@echo off & setlocal ENABLEDELAYEDEXPANSION
for /f "skip=2 tokens=1,2,3* delims=," %%k in ('wmic share where ^(Type^=2147483648^) get Name^,Path /format:csv') DO @(  
	for %%r in ("%%m.") do (  
	 	for /f "tokens=3,*" %%a in ('robocopy "%%~fr." "%%~fr." /l /nocopy /s /is /njh /njs /ndl /nc /ns /ts ^| sort /r ^| findstr /n "^" ^| findstr /l /b /c:"1:"') do set "latest=%%~tb"  
	)
	echo Share: "%%l" # Last change: "!latest!"  
)
Member: BatchAnfaenger91
BatchAnfaenger91 Sep 18, 2015 at 08:25:24 (UTC)
Goto Top
Hallo


Perfekt danke es funktioniert face-smile

ich habe alles verstanden bis auf paar:
was bedeutet bzw. was macht %%~fr und %%~tb ?

Wenn du mir das noch erklären wäre super


Vielen Dank nochmals

Gruß

BatchAnfaenger91
Mitglied: 114757
114757 Sep 18, 2015 at 10:06:33 (UTC)
Goto Top
Zitat von @BatchAnfaenger91:
ich habe alles verstanden bis auf paar:
was bedeutet bzw. was macht %%~fr und %%~tb ?
Geb mal for /? in einer Konsole ein, ganz unten stehen die Erklärungen, das erste macht aus dem Dateinamen einen vollqualifizierten Pfad und das letzte expandiert zum Änderungsdatum der Datei

Gruß jodel32
Member: BatchAnfaenger91
BatchAnfaenger91 Sep 18, 2015 at 10:31:56 (UTC)
Goto Top
super danke habs gefunden und kapiert..

gestern Abend habe ich mal rumprobiert und versucht mit den dir Befehl auf mein Ergebnis zu kommen.

Das habe ich dazu gefunden:

 
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=1" %%a in ('dir "C:\Rohan" /s /T:W /A:-D /O:-D ^| sort /r ^|findstr /n "^" ^| findstr /l /b /c:"1:"') DO set "last=%%a"  
echo !last:~2!


Er liefert mir auf das gleich Ergebnis wie deins. Nur wenn ich Ihn in meiner For-Schleife einbaue bekomme ich kein Ergebnis

@echo off & setlocal ENABLEDELAYEDEXPANSION
for /f "skip=1 tokens=1,2,3 delims=," %%a in ('wmic share where ^(Type^=0^) get Name^,Path /format: csv ^|findstr "."') DO @(  
	for /f "tokens=1,2 delims=, " %%a in ('dir "%%c" /s /T:W /A:-D /O:-D ^| sort /r ^|findstr /n "^" ^| findstr /l /b /c:"1:"') DO @ (  
	set "latest=%%a"  
	)

echo %%b # %%c # !latest:~2! 


Ich will halt das am Ende das Ergebis den Sharenamen, Path und LastWrite ausliefert.

kannst du vielleicht grob sagen an was es liegenkann ?

Gruß

BatchAnfaenger91