noobstar0815
Goto Top

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
for /f "delims= " %%a in ('dir c:\spss15\*.exe^|findstr /i /l "spsswin.exe"') do echo %%a  
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

Content-ID: 205688

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

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

106543
106543 26.04.2013 um 09:52:40 Uhr
Goto Top
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
Noobstar0815
Noobstar0815 26.04.2013 um 09:53:53 Uhr
Goto Top
Zitat von @106543:
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

Hallo Exzellius, wo genau meinst du das? Also wo soll ich das einfügen?
Noobstar0815
Noobstar0815 26.04.2013 um 09:57:20 Uhr
Goto Top
Habe es jetzt mal in
for /f "delims= " %%a in ('dir "g:\Adobe Reader\*.*" /t:c^|findstr /i /l "*.*"') do echo %%a   
geändert. Fehlermeldungen bleiben aus. So wie alle anderen Ausgaben, sprich ich bekomme nichts zurück.
106543
106543 26.04.2013 um 10:00:24 Uhr
Goto Top
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
Noobstar0815
Noobstar0815 26.04.2013 um 10:00:35 Uhr
Goto Top
Erneut geändert, diesmal wird der Pfad gefunden, und ich bekomme 2mal die Ausgabe Datei nicht gefunden. Es ist aber nur eine Datei vorhanden, warum doppelte Fehlermeldung?
for /f "delims= " %%a in ('dir G:\Adobe Reader*.exe /t:c^|findstr /i /l "*.exe"') do echo %%a   
Noobstar0815
Noobstar0815 26.04.2013 um 10:01:47 Uhr
Goto Top
Genau, ich möchte das Erstelldatum mit dem heutigen Datum abgleichen um zu sehen wie alt die Datei ist, und ob ich besser mal nach Updates schaue :D
Noobstar0815
Noobstar0815 26.04.2013 um 10:23:20 Uhr
Goto Top
Okay, mit einem anderen Code-Schnipsel hab ich jetzt das Datum, jetzt muss ich nur noch schauen dass ich richtig weiter verarbeitet bekomme =)
106543
106543 26.04.2013 um 10:23:29 Uhr
Goto Top
Hi Noobstar,

dir scheint nicht ganz klar zu sein, um was es sich bei "*" handelt face-smile
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 face-smile

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" face-smile

Grüße
Exze

PS: meine Erklärung der Wildcards ist nicht perfekt, vll solltest du dich da nochmal seperat schlau machen face-smile
106543
106543 26.04.2013 um 10:24:40 Uhr
Goto Top
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 =)

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
Endoro
Endoro 26.04.2013 um 10:30:42 Uhr
Goto Top
Hallo Noobstar, hast du dir denn schon überlegt, wie du aus dem Dateidatum und heute die Differenz in Tagen errechnen kannst? So wird es ja nicht gehen:
set /a days=%date%-filedate
Die Lösung hat mit Batch eigentlich nix zu tun.

Gruss!
Noobstar0815
Noobstar0815 26.04.2013 um 10:31:42 Uhr
Goto Top
Hey Exze,
das Problem lag weder an den "" noch am fehlendem \, hatte beides ausprobiert (ja auch zusammen) und da kam dann gar keine Ausgabe mehr.
Aktuell sieht mein Code jetzt so aus:
for %%f in ("g:\Java\*") do echo %%f: %%~tf & if %%~tf EQU   
Allerdings weiß ich nicht, wie ich hinter dem EQU weiter machen muss. Es müsste etwas in Richtung
if %%~tf EQU date -30 echo Name_der_Datei ist veraltet
sein, allerdings weiß ich nicht wie ichs schreiben muss.
Noobstar0815
Noobstar0815 26.04.2013 aktualisiert um 11:32:51 Uhr
Goto Top
Wie rechne ich überhaupt 30 Tage zurück im Datum? Und wie bekomme ich die Uhrzeit weg?
for /f "delims= " %%f in ("g:\Java\*") do set filedate=%%~tf sollte eigentlich nach einem " " trennen oder was verstehe ich da grade nicht?
Endoro
Endoro 26.04.2013 um 11:42:43 Uhr
Goto Top
Die Forschleifenparameter beziehen sich auf den output der Forschleife, nicht deren Variable. Ich weiss auch grad nicht was du mit dem Wildcard in der For-F-Schleife willst.

Gruss!
Noobstar0815
Noobstar0815 26.04.2013 aktualisiert um 11:55:19 Uhr
Goto Top
OK, ich habe 7 Ordner, in diesen 7 Ordnern liegt jeweils neu eine Datei. Diese Datei ist z.B. von Java, Adobe Reader etc. und ich möchte per Skript wissen, welche Datei wie alt ist, bzw. ob sie älter als 30 Tage ist, damit ich im Internet schaue, ob es eine neue Version gibt. Deswegen dachhte ich kann ich ruhig mit einer Wildcrard arbeiten. Vorallem weil in manchen Ordnern .exe in anderen hingegen .msi Dateien sind.
Endoro
Endoro 26.04.2013 um 12:00:45 Uhr
Goto Top
Natürlich kannst du mit Wildcards arbeiten. Aber nicht in einer For-F-Schleife. Dazu gibts die einfache Forschleife und die For-D- und For-R-Schleife. Wenn du die in der For-F-Schleife verwenden willst, geht das nur über die Kommando-Syntax:
for /f %%i in ('dir *.exe') do echo %%~i  
Noobstar0815
Noobstar0815 26.04.2013 um 12:05:48 Uhr
Goto Top
Ok werde ich mir merken, allerdings ist die for-Schleife ja nicht das Problem, das Erstelldatum bekomme ich ja ausgelesen, allerdings nicht weiter verarbeitet.
Hätte halt gerne einen if-Befehl wie:
if %filedate% EQU %date%-30 echo %filename% ist veraltet.
Ist dies möglich? Und wo müsste ich die Variable %filename% am besten rausnehmen?
Endoro
Endoro 26.04.2013 um 12:10:37 Uhr
Goto Top
Es gibt in Batch keine Funktion, die ein Datum von einem anderen abzieht oder Tage (Wochen, Monate ...) mit einem Datum verrechnet. Das muss zu Fuss erledigt werden. Oder du nimmst Programme, die mit solchen Angaben umgehen können (zB. XCopy, Forfiles, robocopy).

Gruss!
Noobstar0815
Noobstar0815 26.04.2013 um 12:23:48 Uhr
Goto Top
Ok, dann etwas anderes, wie genau bekomme ich die Uhrzeit weg?
Noobstar0815
Noobstar0815 26.04.2013 um 12:53:13 Uhr
Goto Top
Oder besser : Bekomm ich das Erstelldatum in 3 Variablen zerlegt?
Variable1 26
Variable2 04
Variable3 2013
geht das?
Endoro
Endoro 26.04.2013 um 13:26:15 Uhr
Goto Top
Ja, das Datum kannst du mit einer For-F-Schleife zerlegen:
@echo off &setlocal
set "datum=26.04.2013"  
for /f "tokens=1-3 delims=." %%i in ("%datum%") do set "day=%%i"&set "month=%%j"&set "year=%%k"  
echo %day% %month% %year%

Gruss!
Noobstar0815
Noobstar0815 26.04.2013 um 13:38:47 Uhr
Goto Top
Perfekt, danke =)
Ich arbeite grade trotzdem mal dran, es hinzubekommen, es nur mit Batch zu schaffen :D
Das mit der for-Schleife hat mir ne Menge arbeit gespart :D
Noobstar0815
Noobstar0815 26.04.2013 um 13:43:37 Uhr
Goto Top
Ich bräuchte nur noch eine einzige Sache um es hinzubekommen. Wie rechne ich in Batch-Dateien Differenzen zwischen 2 Zahlen aus? Gehen tut es mit Sicherheit, aber wie?
Endoro
Endoro 26.04.2013 um 13:49:44 Uhr
Goto Top
Wie im normalen Leben:
@echo off &setlocal
set /a a=5
set /a b=3
set /a c=a-b
echo %c%
Das steht auch im Hilfetext von "set /?".

Gruss!
Noobstar0815
Noobstar0815 26.04.2013 um 13:53:31 Uhr
Goto Top
Das funktioniert leider nur nicht mehr, wenn b > a ist, aber ich trotzdem die Differenz brauchen. Also 3-5 ist -2, die Differenz allerdings ist 2. Heißt ich müsste dann noch das - wegbekommen.
Endoro
Endoro 26.04.2013 um 13:58:37 Uhr
Goto Top
Es gibt in Batch keine "ABS"-Funktion. Die musst du mit "if" nachbauen oder die Variable mit "delims=-" durch die Forschleife jagen.

Gruss!
Noobstar0815
Noobstar0815 26.04.2013 um 13:59:14 Uhr
Goto Top
Alles klar danke =)
Noobstar0815
Noobstar0815 26.04.2013 um 14:09:43 Uhr
Goto Top
Dann noch eine Sache :D Dann solte ich wirklich alles parat haben dafür :D
Du hattest mir grade den Code geschickt, um die Uhrzeit wegzubekommen. Das klappt so weit ganz gut, solange ich das Datum habe (Bei dem Erstellungsdatum bekomm ich es in eine Variable), aber wie schaff ich das mit dem aktuellen Datum?
Endoro
Endoro 26.04.2013 um 14:21:10 Uhr
Goto Top
Hey, das ist doch schon in einer Variable. Sie heisst %date%.

Gruss!
Noobstar0815
Noobstar0815 26.04.2013 um 14:26:42 Uhr
Goto Top
Hey, das Problem ist nur, wenn ich es so mache:
for /f "tokens=1-3 delims=." %%i in (%date%) do set "day=%%i"&set "month=%%j"&set "year=%%k"  
echo %day% %month% %year%
kommt jedes Mal ein Fehler : "Die Datei Fr kann nicht gefunden werden"
Endoro
Endoro 26.04.2013 um 14:34:13 Uhr
Goto Top
Das Datum ist ja auch ein String, kein Dateiname. Ich habs oben anders gemacht :P

Tipp: "for /?"
Noobstar0815
Noobstar0815 26.04.2013 um 14:39:22 Uhr
Goto Top
Sorry kann langsam nicht mehr am Bildschirm arbeiten ... Wärst du so freundlich und würdest dich wiederholen?
Drecksmonitor ... ich weiß warum ich diesmal erst alles auf einen Zettel geschrieben habe bevor ich ans Skripten ging ...
Endoro
Endoro 26.04.2013 aktualisiert um 14:46:20 Uhr
Goto Top
@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 face-smile

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.
Noobstar0815
Noobstar0815 26.04.2013 um 14:55:01 Uhr
Goto Top
Ich mach keine Pause heute ... :D
also so weit bin ich jetzt, es gibt nur noch ein Problem, ich habe vergessen, dass Batch nicht > (größer als) < (kleiner als) kennt, wie kann ich das trotzdem schaffen? :D
for /f "delims= " %%f in ("g:\Java\*") do set filedate=%%~tf  
for /f "tokens=1-5 delims=. " %%i in ("%filedate%") do set "dayf=%%i"&set "monthf=%%j"&set "yearf=%%k"  

for /f "tokens=1-5 delims=. " %%i in ("%date%") do set "dayc=%%j"&set "monthc=%%k"&set "yearc=%%l"  
echo %day% %month% %year%

set DEDd=%dayf%
set DEDm=%monthf%
set DEDy=%yearf%

set Cd=%dayc%
set Cm=%monthc%
set Cy=%yearc%

set dDiv1=0
set dDiv2=0
set mDiv1=0
set mDiv2=0
set yDiv1=0
set yDiv2=0

if %DEDd% > %Cd% (
	set %dDiv1%=%DEDd%-%Cd%
) else (
	set %dDiv2%=%Cd%-%DEDd%
)

if %DEDm% > %Cm% (
	set %mDiv1%=%DEDm%-%Cm%
) else (
	set %mDiv2%=%Cm%-%DEDm%
)

if %DEDy% > %Cy% (
	set %yDiv1%=%DEDy%-%Cy%
) else (
	set %yDiv2%=%Cy%-%DEDy%
)
if NOT mDiv1=0 set mDivd=%mDiv1%*30
if NOT mDiv2=0 set mDivd=%mDiv2%*30
if NOT yDiv1=0 set yDivd=%yDiv1%*365
if NOT yDiv2=0 set yDivd=%yDiv2%*365



if %DEDy% < %Cy% (
	if %DEDm% > %Cm% (
		if %DEDd% > %Cd% (
			set age=365-(mDivd+dDiv) & echo Datei ist %age% Tage alt.
			) else (
			set age=365+%dDiv%-%mDivd% & echo Datei ist %age% Tage alt.
			)
		) else (
		set age=365+%dDiv%+%mDivd% & echo Datei ist %age% Tage alt.
		)
	) else (
		if %DEDm% > %Cm% (
			if %DEDd% > %Cd% (
				set age=%mDivd%+%dDiv% & echo Datei ist %age% Tage alt.
				) else (
				set age=%dDiv%-%mDivd% & echo Datei ist %age% Tage alt.
				)
			) else (
			set age=%mDivd%+%dDiv%
			)
		)
Endoro
Endoro 26.04.2013 aktualisiert um 15:03:52 Uhr
Goto Top
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).
Noobstar0815
Noobstar0815 26.04.2013 um 15:05:27 Uhr
Goto Top
Danke :D Wär ich n Weib würde ich dich jetzt mit Herzchen zuspammen :D
Noobstar0815
Noobstar0815 26.04.2013 um 15:27:48 Uhr
Goto Top
Lalala ... Jetzt ist ein Fehler drin ... Mal sehen wie ich den loswerde :D
if 2013 LSS 2013 (set 0=2013-2013) else (set 0=2013-2013 )
"=0" ist syntaktisch an dieser Stelle nicht verarbeitbar.  
Fällt dir etwas ein wie ich es lösen kann?
Mir fällt nur ein umständlicher weg ein, und da müsste ich mein ganzes Skript neu strukturieren mit Sprungmarken ...
Noobstar0815
Noobstar0815 26.04.2013 um 15:59:47 Uhr
Goto Top
Das Problem ist der folgende Befehl
if mDiv1=q (
	set mDivd=0
	) else (
	set mDivd=%mDiv1%*30
	)
Noobstar0815
Noobstar0815 26.04.2013 um 16:20:35 Uhr
Goto Top
Anfängerfehler ... Mal wieder vergessen, dass es == sein muss...
Jetzt muss ich nur noch n bissl schauen dass das Ergebnis richtig wird :D
Das ist es leider noch nicht :D
Biber
Biber 26.04.2013, aktualisiert am 27.04.2013 um 13:26:41 Uhr
Goto Top
Moin Noobstar0815,

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>
-> 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
Noobstar0815
Noobstar0815 26.04.2013 um 16:49:32 Uhr
Goto Top
Habs gemerkt, leider stimmt trotzdem etwas nicht, angeblich wäre das Ergebnis 365, ist aber eigentlich 2, muss ich noch mal in Ruhe am Montag drüber schauen :D
Noobstar0815
Noobstar0815 30.04.2013 aktualisiert um 14:17:03 Uhr
Goto Top
OK also ich komme nun nicht mehr weiter. Logisches Denken funktioniert bei mir im Moment nicht.

Meine gesamten Variablen sind komischer Weise zum Schluss immer 0. Die Datei die ich prüfe ist vom 24.04.13.

Hier der Code, vielleicht findet ihr den Fehler ja...

EDIT: Code entfernt da Thread sonst zu lang wird auf Dauer
Noobstar0815
Noobstar0815 30.04.2013 um 13:52:43 Uhr
Goto Top
Ok, nach dem einfügen von haufenweise /a geht es. Jetzt bastel ich noch n bisschen dran rum damit es für mehrere Dateien in verschiedenen Ordnern geht, habt ihr Tipps? :D
Noobstar0815
Noobstar0815 30.04.2013 aktualisiert um 15:13:08 Uhr
Goto Top
EDIT: Post gelöscht!
Also, jetzt funktioniert alles wieder, abgesehen davon, dass ich bei den Dateien nicht das Erstelldatum bekomme, sondern das Datum des letzten Zugriffs. Wie bekomme ich das geändert?
Endoro
Endoro 01.05.2013 um 07:13:08 Uhr
Goto Top
Hallo,

das hier könnte weiter helfen.

Gruss!
Noobstar0815
Noobstar0815 06.05.2013 um 08:51:54 Uhr
Goto Top
Zitat von @Endoro:
Hallo,

das hier könnte weiter helfen.

Gruss!

Ja, prinzipiell hilft es mir weiter, allerdings verstehe ich es nicht ganz.

cls
@echo off
for /f "delims=" %%f in ("g:\Adobe Reader\*") do set filedate=%%~tf  
for /f "tokens=1-5 delims=. " %%i in ("%filedate%") do set "dayf=%%i"&set "monthf=%%j"&set "yearf=%%k"  

for /f "tokens=1-5 delims=. " %%i in ("%date%") do set "dayc=%%j"&set "monthc=%%k"&set "yearc=%%l"  
So sehen meine for-Schleifen aus, wie müsste ich das 'dir /TW dort einbauen? Hatte es mit
for /f "tokens=1-5 delims=. " %%i in ('dir /TW"%filedate%") do set "dayf=%%i"&set "monthf=%%j"&set "yearf=%%k"  
versucht, allerdings bekomme ich dann nur Fehlermeldungen. Wäre sehr nett, wenn du es mir erklären könntest =)
Noobstar0815
Noobstar0815 06.05.2013 um 14:45:49 Uhr
Goto Top
Gut ich kapituliere was das angeht. Alleine komme ich nicht weiter, wäre nett wenn mir jemand mal ausführlich erklärt wo mein Fehler liegt, so schauts aktuell aus:
set "dirparms=/4 /TC /TA /TW"   

for %%a in (/4 /TC /TA /TW) do (
for /f "tokens=1-5 delims=. " %%I in ('dir /ON %%a findstr /S *.*') do set "dayf=%%i"&set "monthf=%%j"&set "yearf=%%k"  
)
for %%a in (/4 /TC /TA /TW) do (
for /f "tokens=1-5 delims=. " %%I in ('dir /ON findstr /S *.*') do set "dayc=%%j"&set "monthc=%%k"&set "yearc=%%l"  
)
Endoro
Endoro 06.05.2013 aktualisiert um 19:54:49 Uhr
Goto Top
Hallo Noobstar,

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!
rubberman
rubberman 06.05.2013 um 20:47:17 Uhr
Goto Top
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.

@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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::	
Grüße
rubberman
Endoro
Endoro 06.05.2013 aktualisiert um 21:55:13 Uhr
Goto Top
Hallo,

diese Zeile
for /f "delims=" %%i in ('dir /a-d /b') do (   
liefert wie schon gesagt das Datum des letzten Schreibzugriffs, nicht der Erstellung der Datei (auf NTFS).

Gruss!
rubberman
rubberman 06.05.2013 um 22:19:37 Uhr
Goto Top
Hallo Endoro,

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
Noobstar0815
Noobstar0815 07.05.2013 um 11:44:13 Uhr
Goto Top
Hey Endoro,
das klingt schon mal nicht schlecht, allerdings komme ich nicht ganz damit klar.
Ich schaffe es grade nicht !day! !month! !year! als andere Variable zu setzen.
Wie schaffe ich es aus !day! die Variable %day% zu machen? Mit set day=!day! klappts nicht, da werden die Variablen nicht gesetzt. Desweiteren weiß ich nicht, wie ich es schaffe einen anderen Ordner damit zu durchsuchen als den jetzigen. Ein bisschen mehr Hilfe wäre lieb =)
Endoro
Endoro 07.05.2013 um 13:33:46 Uhr
Goto Top
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!
Noobstar0815
Noobstar0815 07.05.2013 um 13:44:15 Uhr
Goto Top
Endoro bei mir ists so, in den Ordnern befindet sich immer nur eine einzige Datei. Leider kann ich nicht innerhalb der for-Schleife weiterarbeiten (soweit ich weis). Die Batch-Datei soll mir das Datum des Erstellens der Datei angeben, tut sie ja, allerdings als !day!!month!!year!. Ich bräuchte sie allerdings als %dayf%%monthf%%yearf%, wie bekomme ich das hin?
Endoro
Endoro 07.05.2013 um 14:02:42 Uhr
Goto Top
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%
Noobstar0815
Noobstar0815 07.05.2013 um 15:41:22 Uhr
Goto Top
Ok funktioniert =) Allerdings gibt es da noch eine letzte Sache :D Ich habe 7 Ordner, je eine Datei, aber ich weiß nicht, wie ich es jetzt schaffe, dass die Datei in G:\automatischeUpdateswoechentlich\Update-Skripte liegt, und von dort aus nach G:\automatischeUpdateswoechentlich\Adobe Flash Player Active X springt. Wenn ich das schaffe, werde ich ein 2. Skript schreiben, in etwas so:
call Hauptskript & set PfadVariableFürPassendeDatei
call Hauptskript & set ...
...
für jeden Ordner halt einmal.
Endoro
Endoro 07.05.2013 um 15:55:10 Uhr
Goto Top
Du könntest es mit einer for-R-Schleife versuchen.

for /r "G:\automatischeUpdateswoechentlich" %%i in (*) do echo(%%~fi  

Statt echo kannst du ja was Sinnvolles hinschreiben.
Noobstar0815
Noobstar0815 08.05.2013 um 08:18:41 Uhr
Goto Top
Neues Problem,
for /f "tokens=1-5 delims=. " %%i in ("%date%") do set "dayc=%%j" & set "monthc=%%k" & set "yearc=%%l"  
gibt mir diesen Fehler:
G:\>set /a Cd=08
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
Weiß jemand warum? Dachte erst es liegt an der führenden 0, allerdings funktionierte es gestern und auch mit dem Monat 05 gibt es keine Probleme.
Endoro
Endoro 08.05.2013 um 08:39:50 Uhr
Goto Top
Hallo,

Zitat von @Noobstar0815:
Weiß jemand warum? Dachte erst es liegt an der führenden 0,

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!
Noobstar0815
Noobstar0815 08.05.2013 um 08:58:54 Uhr
Goto Top
Gut, das habe ich hinbekommen, allerdings scheitere ich grade wieder an anderen Sachen...
set /a counter=1

:loop
set /a %counter%=%counter%+1
funktioniert nicht.
if %counter%==1 set "%ordner%=Adobe Flash Player Active X\"& set "%ProgName%=Adobe Flash Player Active X"  
if %counter%==2 set %ordner%=Adobe Flash Player Plug-In\& set %ProgName%=Adobe Flash Player Plug-In
if %counter%==3 set %ordner%=Adobe Reader\& set %ProgName%=Adobe Reader
if %counter%==4 set %ordner%=Adobe Shockwave\& set %ProgName%=Adobe Shockwave
if %counter%==5 set %ordner%=Firefox\& set %ProgName%=Firefox
if %counter%==6 set %ordner%=Java\& set %ProgName%=Java
if %counter%==7 set %ordner%=Microsoft Defender\& set %ProgName%=Microsoft Defender
if %counter%==8 goto END
schmeißt mir direkt bei if %counter%==1 einen doppelten Syntax Fehler aus
for /f "delims=" "G:\%ordner%" %%i in ('dir /a-d /tc ^| findstr /b [0-9]') do (  
	for /f "tokens=1-6*delims=.: " %%a in ("%%i") do (  
		set "dayf=%%a"  
		set "monthf=%%b"  
		set "yearf=%%c"  
	)
)
"G:\" syntaktisch nicht verarbeitbar, weiger sich scheinbar den %ordner% zu setzen
Noobstar0815
Noobstar0815 08.05.2013 um 10:07:35 Uhr
Goto Top
Also alle Fehler behoben, schaffe es allerdings immer noch nicht in die Ordner zu kommen. Wenn ich es richtig verstehe mit der for /r schleife geht sie dann in jeden Ordner, allerdings gibt es dort Ordner die irrelevant sind, deswegen würde ich es gerne machen wie oben genannt, einen Counter einbauen (gemacht), der mir die Variablen passend für den gewünschten Ordner setzt (geschafft) und zum Schluss beendet (geschafft). Einzige was ich nicht schaffe ist es richtig einzusetzen.
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 "dayf=%%a"  
		set "monthf=%%b"  
		set "yearf=%%c"  
	)
)
Wo muss ich da in diesem code die Variable "G:\%ordner%" einbauen, damit es funktioniert?
Endoro
Endoro 08.05.2013 um 10:30:21 Uhr
Goto Top
Bei der For-r-Scheife kann ein Startfolder angegeben werden, bei der For-f-Schleife ist das eher sinnlos. Hier gehört das zum "dir" Befehl:

for /f "delims=" %%i in ('dir /a-d /tc "G:\%ordner%" ^| findstr /b [0-9]') do (  
Noobstar0815
Noobstar0815 08.05.2013 um 10:59:22 Uhr
Goto Top
Danke, bin nun endlich fertig mit dem Skript =)