Erstelldatum einer Datei per Batch ausgeben
Hallo,
ich habe im Internet schon eine Code-Zeile gefunden, allerdings komme ich damit noch nicht ganz klar.
Die Code-Zeile lautet
Um das Datum der Datei meines Wunsches zu finden, änderte ich dir c: in dir g: und gab den Pfad an, und "spsswin.exe" änderte ich in *exe.
Leider kommte jedes Mal die Fehlermeldung, dass die Datei nicht gefunden werden kann. Also änderte ich "*.exe" in "Dateiname.exe" ab, leider ohne Erfolg.
Ich hab das Gefühl, dass ich vorne bei dem "delims= " noch etwas einfügen muss, allerdings ist der Code nicht genau beschrieben und ich kenne mich mit dem for-Befehl immer noch nicht aus.
Das ist allerdings nur das eine Problem. Das Andere ist, dass ich das gefundene Datum mit dem heutigen Datum vergleichen möchte, und möchte eine Meldung bekommen von den Dateien die älter als z.B. 30 Tage sind.
Könnt ihr mir bitte helfen dies zu realisieren?
Danke im Vorraus =)
MfG Noobstar0815
ich habe im Internet schon eine Code-Zeile gefunden, allerdings komme ich damit noch nicht ganz klar.
Die Code-Zeile lautet
for /f "delims= " %%a in ('dir c:\spss15\*.exe^|findstr /i /l "spsswin.exe"') do echo %%a
Leider kommte jedes Mal die Fehlermeldung, dass die Datei nicht gefunden werden kann. Also änderte ich "*.exe" in "Dateiname.exe" ab, leider ohne Erfolg.
Ich hab das Gefühl, dass ich vorne bei dem "delims= " noch etwas einfügen muss, allerdings ist der Code nicht genau beschrieben und ich kenne mich mit dem for-Befehl immer noch nicht aus.
Das ist allerdings nur das eine Problem. Das Andere ist, dass ich das gefundene Datum mit dem heutigen Datum vergleichen möchte, und möchte eine Meldung bekommen von den Dateien die älter als z.B. 30 Tage sind.
Könnt ihr mir bitte helfen dies zu realisieren?
Danke im Vorraus =)
MfG Noobstar0815
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 205688
Url: https://administrator.de/contentid/205688
Ausgedruckt am: 26.11.2024 um 09:11 Uhr
62 Kommentare
Neuester Kommentar
Hi,
wenn du eine .exe-Datei überprüfen musst, dann nimmst du "*.exe" wenn´s ne .txt-Datei ist nimmst du "*.txt" etc
wenn du nicht weißt, welche Endung, dann "*.*" ;)
Grüße
Exze
wenn du eine .exe-Datei überprüfen musst, dann nimmst du "*.exe" wenn´s ne .txt-Datei ist nimmst du "*.txt" etc
wenn du nicht weißt, welche Endung, dann "*.*" ;)
Grüße
Exze
Hi,
ach du willst das Erstelldatum der Reader.exe oder so auslesen oder ? :D
dann änder dein "*.*" wieder in "*.exe". Was daran aber falsch ist kann ich dir nixht sagen, weil ich nicht sooo viel Anhung von Batchen hab ;) bin aktuell eher mit VB unterwegs.
Viel Glück noch...
Grüße
Exze
ach du willst das Erstelldatum der Reader.exe oder so auslesen oder ? :D
dann änder dein "*.*" wieder in "*.exe". Was daran aber falsch ist kann ich dir nixht sagen, weil ich nicht sooo viel Anhung von Batchen hab ;) bin aktuell eher mit VB unterwegs.
Viel Glück noch...
Grüße
Exze
Hi Noobstar,
dir scheint nicht ganz klar zu sein, um was es sich bei "*" handelt
Das nennt man Wildcard und d.h. wenn man die z.B. wie bei dir in eine Filertung oder Suche einbaut, wird einfach alle angezeigt bzw. bearbeitet, was den festgelegten Teil im Namen hat d.h. wenn du 3 Dateien hast
Datei1.txt
Datei2.exe
Datei3.txt
und du suchst per Batch nach "Datei*", dann gibt´s dir alle drei aus, wenn du nach Datei*.txt suchst gibt´s dir Datei1 und 3 aus
Von daher muss dein Pfad lauten: G:\Adobe Reader\*.exe
du hast den \ nach Adobe Reader vergessen und was auch wichtig ist, setze den Pfad in Anführungszeichen, weil sonst das Leerzeichen den Pfad zerschießt
also im Endeffekt folgender Pfad: "G:\Adobe Reader\*.exe"
Grüße
Exze
PS: meine Erklärung der Wildcards ist nicht perfekt, vll solltest du dich da nochmal seperat schlau machen
dir scheint nicht ganz klar zu sein, um was es sich bei "*" handelt
Das nennt man Wildcard und d.h. wenn man die z.B. wie bei dir in eine Filertung oder Suche einbaut, wird einfach alle angezeigt bzw. bearbeitet, was den festgelegten Teil im Namen hat d.h. wenn du 3 Dateien hast
Datei1.txt
Datei2.exe
Datei3.txt
und du suchst per Batch nach "Datei*", dann gibt´s dir alle drei aus, wenn du nach Datei*.txt suchst gibt´s dir Datei1 und 3 aus
Von daher muss dein Pfad lauten: G:\Adobe Reader\*.exe
du hast den \ nach Adobe Reader vergessen und was auch wichtig ist, setze den Pfad in Anführungszeichen, weil sonst das Leerzeichen den Pfad zerschießt
also im Endeffekt folgender Pfad: "G:\Adobe Reader\*.exe"
Grüße
Exze
PS: meine Erklärung der Wildcards ist nicht perfekt, vll solltest du dich da nochmal seperat schlau machen
Zitat von @Noobstar0815:
Okay, mit einem anderen Code-Schnipsel hab ich jetzt das Datum, jetzt muss ich nur noch schauen dass ich richtig weiter
verarbeitet bekomme =)
Okay, mit einem anderen Code-Schnipsel hab ich jetzt das Datum, jetzt muss ich nur noch schauen dass ich richtig weiter
verarbeitet bekomme =)
Toll aber ich würde trotzdem empfehlen mit dem alten weiter zu versuchen sonst lernst du nie was, wenn du immer nur Code-Snippets aus dem internet zusammenklaubst, aber keine Ahnung hast, wie sie funktionieren.
Grüße
Exze
@echo off &setlocal
for /f "tokens=1-3 delims=." %%i in ("%date%") do set "day=%%i"&set "month=%%j"&set "year=%%k"
echo %day% %month% %year%
Dann mach doch mal 'ne Pause. Ich mach auch eine
Gruss!
PS: und immer daran denken: Datum & Zeit sind keine Nummern, sondern Strings. Es wird ausgegeben, was du in der Systemsteuerung eingegeben hast unter Datums-/Zeitformat.
Verarbeitet Ausdrücke in einer Batchdatei abhängig von Bedingungen.
IF [NOT] ERRORLEVEL Nummer Befehl
IF [NOT] Zeichenfolge1==Zeichenfolge2 Befehl
IF [NOT] EXIST Dateiname Befehl
NOT Befehl wird nur dann ausgeführt, wenn die Bedingung nicht
erfüllt ist.
ERRORLEVEL Nummer Bedingung ist erfüllt, wenn das zuletzt ausgeführte
Programm einen Code größer oder gleich der Nummer
zurückgibt.
Zeichenfolge1==Zeichenfolge2
Bedingung ist erfüllt, falls die Zeichenfolgen gleich sind.
EXIST Dateiname Bedingung ist erfüllt, wenn die angegebene Datei existiert.
Befehl Gibt den Befehl an, der bei erfüllter Bedingung ausgeführt
werden soll. Diesem Befehl kann das Schlüsselwort ELSE
folgen. Der Befehl nach dem Wort ELSE wird ausgeführt, wenn
die angegebene Bedingung nicht erfüllt ist (FALSE).
Die ELSE-Klausel muss auf der Zeile mit dem Befehl nach dem IF stehen.
Zum Beispiel:
IF EXIST test.txt (
del test.txt
) ELSE (
echo test.txt fehlt
)
Die beiden folgenden Beispiele funktionieren nicht. Im ersten Fall wird der
DEL-Befehl nicht durch ein Zeilenende abgeschlossen:
IF EXIST test.txt del test.txt ELSE echo test.txt fehlt
In zweiten Fall befindet sich der ELSE-Befehl nicht auf derselben Zeile mit
dem IF Schlüsselwort:
IF EXIST test.txt del test.txt
ELSE echo test.txt fehlt
Hier ein Beispiel, wie alles auf einer Zeile angegeben werden kann:
IF EXIST test.txt (del test.txt) ELSE echo test.txt fehlt
Wenn die Befehlserweiterungen aktiviert sind, wird der IF-Befehl folgendermaßen
verändert:
IF [/I] Zeichenfolge1 Vergleichsoperator Zeichenfolge2 Befehl
IF CMDEXTVERSION Zahl Befehl
IF DEFINED Variable Befehl
Dabei kann der Vergleichsoperator einer der folgenden sein:
EQU - gleich
NEQ - nicht gleich
LSS - kleiner als
LEQ - kleiner als oder gleich
GTR - größer als
GEQ - größer als oder gleich
Die /I-Option wird angegeben, um die Groß-/Kleinschreibung beim Vergleich zu
ignorieren. Die /I-Option kann auch in der Form Zeichenfolge1==Zeichenfolge2
verwendet werden. Diese Vergleiche sind allgemein, das heißt, wenn beide
Zeichenfolgen nur aus Ziffern bestehen, werden die Zeichenfolgen in Zahlen
umgewandelt, und es wird ein nummerischer Vergleich durchgeführt.
Die Bedingung CMDEXTVERSION arbeitet genau wie ERRORLEVEL, nur dass
dabei mit einer internen Versionsnummer der Befehlserweiterungen verglichen
wird. Die erste Versionsnummer ist 1. Diese wird um eins erhöht werden, wenn
bedeutende Verbesserungen an den Befehlserweiterungen gemacht werden.
Die Bedingung CMDEXTVERSION ist falsch, wenn die Befehlserweiterungen nicht
aktiviert sind.
Die Bedingung DEFINED arbeitet genau wie EXIST, bezieht sich aber auf
den Namen einer Umgebungsvariablen und ist wahr, wenn die Umgebungs-
variable definiert ist.
Der Ausdruck %ERRORLEVEL% wird zu einer Zeichendarstellung des aktuellen
Werts der Variablen ERRORLEVEL expandiert (vorausgesetzt, es gibt nicht bereits
eine Umgebungsvariable mit dem Namen ERRORLEVEL, deren Wert man dann erhält).
Nachdem ein Programm ausgeführt wurde, sieht die Verwendung von ERRORLEVEL
wie folgt aus:
goto Antwort%ERRORLEVEL%
:Antwort0
echo J für Ja eingegeben
:Antwort1
echo N für Nein eingegeben
oder unter Verwendung der Vergleichsoperatoren:
IF %ERRORLEVEL% LEQ 1 goto ok
Der Ausdruck %CMDCMDLINE% wird zu der originalen Befehlszeile expandiert,
die CMD.EXE vor irgendeiner Bearbeitung übergeben wird (vorausgesetzt, es gibt
nicht bereits eine Umgebungsvariable mit dem Namen CMDCMDLINE, deren Wert man
dann erhält).
Der Ausdruck %CMDEXTVERSION% wird zu einer Zeichendarstellung des aktuellen
Werts der Variablen CMDEXTVERSION expandiert (vorausgesetzt, es gibt nicht
bereits eine Umgebungsvariable mit dem Namen CMDEXTVERSION, deren Wert man
dann erhält).
Moin Noobstar0815,
wenn du den SET-Befhl zum "Rechnen" benutzen willst, dann musst du "set /a" wie arthitisch verwenden.
Keinen Unterschied macht zwar
Einen Unterschied macht aber die zweite Zuweisung:
-> bei Set ohne /a wird alles nachfolgende einfach nur als Text übernehmen, lediglich enthaltene %Variablen% werden aufgelöst.
Mit Set /a wird gerechnet.
Das Ergebnis steht allerdings erst für den nachfolgenden CMD-Befehl zur Verfügung/ist nicht in derselben CMD-Zeile verfügbar.
Grüße
Biber
wenn du den SET-Befhl zum "Rechnen" benutzen willst, dann musst du "set /a" wie arthitisch verwenden.
Keinen Unterschied macht zwar
Set mDiv0=0
vs. Set /a mDiv0=0
. In beiden Fällen ist mDiv0 gleich 0.Einen Unterschied macht aber die zweite Zuweisung:
C:\Temp>set mdiv1=23
C:\Temp>set mDivd=%mDiv1%*30
C:\Temp>set mDivd
mDivd=23*30
C:\Temp>set /a mivd=%mDiv1%*30
690
C:\Temp>
Mit Set /a wird gerechnet.
Das Ergebnis steht allerdings erst für den nachfolgenden CMD-Befehl zur Verfügung/ist nicht in derselben CMD-Zeile verfügbar.
Grüße
Biber
Hallo Noobstar,
du wolltest das Erstelldatum ("dir /tc"), leider bekommt man das nicht mit "dir /b /tc" raus, weswegen ein Umweg erforderlich ist:
Die erste Forschleife filtert aus dem "dir"-Befehl die uns interessierenden Zeilen raus, die zweite Forschleife zerlegt die gefundenen Dateiinformationen in die einzelnen Tokens.
Bei mir sieht das dann so aus, daraus:
.. wird dieses:
Gruss!
du wolltest das Erstelldatum ("dir /tc"), leider bekommt man das nicht mit "dir /b /tc" raus, weswegen ein Umweg erforderlich ist:
@echo off &setlocal
for /f "delims=" %%i in ('dir /a-d /tc ^| findstr /b [0-9]') do (
for /f "tokens=1-6*delims=.: " %%a in ("%%i") do (
set "day=%%a"
set "month=%%b"
set "year=%%c"
set "hour=%%d"
set "min=%%e"
set "fname=%%g"
)
setlocal enabledelayedexpansion
echo(!year! !month! !day! !hour!:!min! # !fname!
endlocal
)
Die erste Forschleife filtert aus dem "dir"-Befehl die uns interessierenden Zeilen raus, die zweite Forschleife zerlegt die gefundenen Dateiinformationen in die einzelnen Tokens.
Bei mir sieht das dann so aus, daraus:
C:\TEMP>dir /a-d /tc
Volume in Laufwerk C: hat keine Bezeichnung.
Volumeseriennummer: ABCD-EFGH
Verzeichnis von C:\TEMP
06.05.2013 16:04 4 file1.txt
06.05.2013 16:04 0 file2.txt
06.05.2013 16:04 0 file3.txt
06.05.2013 16:04 0 file4.txt
06.05.2013 16:04 0 file5.txt
5 Datei(en) 4 Bytes
0 Verzeichnis(se), 440 Bytes frei
.. wird dieses:
2013 05 06 16:04 # file1.txt
2013 05 06 16:04 # file2.txt
2013 05 06 16:04 # file3.txt
2013 05 06 16:04 # file4.txt
2013 05 06 16:04 # file5.txt
Gruss!
Hallo Zusammen,
ich verweise mal auf DateToDays, immerhin geht es ja (wenn ich es richtig verstanden habe) auch darum Dateien älter als 30 Tage zu detektieren.
Grüße
rubberman
ich verweise mal auf DateToDays, immerhin geht es ja (wenn ich es richtig verstanden habe) auch darum Dateien älter als 30 Tage zu detektieren.
@echo off &setlocal
for /f "tokens=1-3 delims=." %%i in ("%date%") do (
set /a "dnow = 100%%i %% 100, mnow = 100%%j %% 100, ynow = 10000%%k %% 10000"
)
call :DateToDays %ynow% %mnow% %dnow% daysnow
for /f "delims=" %%i in ('dir /a-d /b') do (
set "filename=%%~i"
setlocal EnableDelayedExpansion
for /f "tokens=1-3 delims=. " %%j in ("%%~ti") do (
set /a "dfile = 100%%j %% 100, mfile = 100%%k %% 100, yfile = 10000%%l %% 10000"
call :DateToDays !yfile! !mfile! !dfile! daysfile
set /a "diff = daysnow - daysfile"
if !diff! gtr 30 <nul set /p "=*** ACHTUNG^! *** "
echo Datei !filename! ist !diff! Tage alt.
)
endlocal
)
pause
goto :eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToDays %yy% %mm% %dd% days
::
:: By: Ritchie Lawrence, 2002-09-26. Version 1.0
::
:: Func: Returns the number of days elapsed since 1st January 1970 for a
:: given date. For NT4/2000/XP/2003.
::
:: Args: %1 year component used to create days, 2 or 4 digits (by val)
:: %2 month component used to create days, leading zero ok (by val)
:: %3 date of month used to create days, leading zero ok (by val)
:: %4 var to receive number of elapsed days (by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
endlocal&set %4=%j%&goto :EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
rubberman
Hallo Endoro,
das ist doch auch kein Problem, oder?
Für die Zeilen 08 bis 19 aus meinem Script:
Grüße
rubberman
das ist doch auch kein Problem, oder?
Für die Zeilen 08 bis 19 aus meinem Script:
for /f "tokens=1,3*" %%A in ('dir /a-d /tc^|findstr /vbc:" "') do (
set "filename=%%~C"
setlocal EnableDelayedExpansion
for /f "tokens=1-3 delims=. " %%j in ("%%A") do (
set /a "dfile = 100%%j %% 100, mfile = 100%%k %% 100, yfile = 10000%%l %% 10000"
call :DateToDays !yfile! !mfile! !dfile! daysfile
set /a "diff = daysnow - daysfile"
if !diff! gtr 30 <nul set /p "=*** ACHTUNG^! *** "
echo Datei !filename! ist !diff! Tage alt.
)
endlocal
)
Grüße
rubberman
Hallo Noobstar,
du kannst die Variablen natürlich auch ausserhalb der Forschleife verwenden, musst dir aber überlegen, von welcher Datei. Denn day usw. gibs ja erstmal nur einmal. Andererseits kannst du auch mit !day! innerhalb der Schleife weitermachen, das nimmt nach jedem Schleifendurchlauf den Wert der nächsten Datei an.
Gruss!
du kannst die Variablen natürlich auch ausserhalb der Forschleife verwenden, musst dir aber überlegen, von welcher Datei. Denn day usw. gibs ja erstmal nur einmal. Andererseits kannst du auch mit !day! innerhalb der Schleife weitermachen, das nimmt nach jedem Schleifendurchlauf den Wert der nächsten Datei an.
Gruss!
Wenn es nur eine Datei ist, dann schreibst du es einfach hin:
@echo off &setlocal
for /f "delims=" %%i in ('dir /a-d /tc ^| findstr /b [0-9]') do (
for /f "tokens=1-6*delims=.: " %%a in ("%%i") do (
set "day=%%a"
set "month=%%b"
set "year=%%c"
set "hour=%%d"
set "min=%%e"
set "fname=%%g"
)
)
echo(%year% %month% %day% %hour%:%min% # %fname%
Hallo,
ja, daran liegt es. Bei 8 und 9 darf bei set /a keine Null führen, weil das keine gültigen Oktalzahlen sind. Man kann sich mit so etwas behelfen:
Gruss!
ja, daran liegt es. Bei 8 und 9 darf bei set /a keine Null führen, weil das keine gültigen Oktalzahlen sind. Man kann sich mit so etwas behelfen:
@echo off &setlocal
set "Svar=09"
set /a Nvar=1%Svar%-100
echo %Nvar%
Gruss!