ghostx
Goto Top

Dateien aus einer Abfrage ausschließen

Hallo Gemeinde,

habe eine Frage ...(was sonst?) face-smile)

Habe eine Batch Datei die in einem Verzeichnis alle Dateien nach dem aktuellen Datum überprüft und eine Meldung ausgibt falls eine Datei kein aktuelles Datum hat. Möchte aber einige Dateien aus der Abfrage ausschließen. Wie muss ich mein Script umbauen um das zu lösen?

Mein jetziger Script:

@echo off & setlocal 
set Dateien=  "C:\Dateien\*"  

set "Vergleich=%date%"  
set "Log=C:\Test.log"  

if exist "%Log%" del "%Log%"  

echo>>"%Log%" %date%  

for %%i in (%Dateien%) do if exist %%i ( 
	echo %%~ti|findstr /b "%Vergleich%">nul || echo >>"%Log%" Datei nicht aktuell: %%i   
) 

if exist "%Log%" notepad "%Log%"  

Content-Key: 146978

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

Printed on: April 19, 2024 at 13:04 o'clock

Member: Biber
Biber Jul 15, 2010 at 13:40:43 (UTC)
Goto Top
Moin GhostX,

ich hab deinem Schnipsel mal codeformatierung spendiert.

Am einfachsten wäre es, wenn du die auszuschliessenden Dateinamen in einer Liste (=Textdatei) zeilenweise sammelst.
Dann kannst du ergänzen:
@echo off & setlocal 
set Dateien=  "C:\Dateien\*"  

set "Vergleich=%date%"  
set "Log=C:\Test.log"  

if exist "%Log%" del "%Log%"  

echo>>"%Log%" %date%  

for %%i in (%Dateien%) do Findstr /i /C:"%%i" X:\YZ\DontCare.txt>nul ||if exist %%i (   
	echo %%~ti|findstr /b "%Vergleich%">nul || echo >>"%Log%" Datei nicht aktuell: %%i   
) 

if exist "%Log%" notepad "%Log%"  


Falls der Ausschluss sich aler auf Wildcards bezieht (alle "*.sik" oder alle "final*.*"-Dateien, dann wäre ein anderes Vorgehen sinnvoll.

Grüße
Biber
Mitglied: 60730
60730 Jul 15, 2010 at 13:44:11 (UTC)
Goto Top
moin,

so wie das script aufgebaut ist - fehlt doch nur innerhalb der Schleife (vor zeile 12) if not "%%i"=="aberdunicht.txt" if not "%%i"=="undDUschonGarnicht.exe"

Oder wenn es mehrere wären, eine weitere Schleife die auch wieder ein if x not y macht.

Gruß

edit
ich hab deinem Schnipsel mal codeformatierung spendiert.

Sie schon wieder und ich hab mich schon "gefreut", dass der OT das selber kann....

Via Findstr - anstatt ner zweiten Schleife ist ein schöner Biber /edit
Member: ghostX
ghostX Jul 16, 2010 at 08:15:52 (UTC)
Goto Top
Hi,

danke für eure Antworten.

Will aber noch nicht funktionieren. Es schließt die Dateien in der Textdatei nicht aus. Muss ich nicht anstatt




schreiben?

Möchte ja nicht in C: suchen sondern in den Verzeichnissen die ich unter "Dateien" angegeben habe

Es sind mehrere Dateien in der Textdatei die ausgeschlossen werden sollen (ca 20), deshalb wird es etwas zu lang mit Timo seiner Lösung

/Edit: Ok sorry muss mich korrigieren, es funktioniert, aber leider löst das nicht mein Problem. Hatte einen Denkfehler.

Brauche eigentlich nur ein Script der in einem Verzeichnis zwischen mehreren Dateien überprüft ob eine Datei mit dem heutigen Datum vorhanden ist. (Es langt wenn nur eine Datei das aktuelle Datum hat, also es ist egal wenn andere ältere Dateien vorhanden sind) Wenn nicht dann soll er mir nur sagen dass es nicht aktuell ist.

Sorry wegen den dummen Fragen, bin wirklich noch ein Anfänger in dem Gebiet.

Etwas Hintergrundinfo: Es wird täglich ein Backup erstellt das jeden Tag einen anderen Dateinamen bekommt, die alten Backupdateien werden nicht überschrieben und bleiben im selben Verzeichnis. deshalb kann ich in meiner Abfrage nicht nach Dateinamen oder Dateiendung gehen sondern muss nach Datum gehen.
Member: Biber
Biber Jul 16, 2010 at 11:24:20 (UTC)
Goto Top
Moin ghostX,

es mag an der langen und heißen Woche voller Montage liegen, aber....

Zitat von @ghostX:
Brauche eigentlich nur ..[... ]. (Es langt wenn nur eine Datei das aktuelle Datum hat,
also es ist egal wenn andere ältere Dateien vorhanden sind)
Wenn nicht dann soll er mir nur sagen dass es nicht aktuell ist.

Noch mal mit meinen Worten - neue Aufgabenstellung ist jetzt
  • ein bestimmtes Verzeichnis abgrasen
  • und daraufhin prüfen, ob mindestens eine Datei mit heutigem Datum vorhanden ist?
  • und wenn keine Datei von heute vorhanden ist, dann...???

Versteh ich nicht ganz.
-> Entweder dein Backupkrams läuft zeitgesteuert.
Jeden Tach meinetwegen.
Dann kann es entweder a) klappen oder b) nicht klappen.
Wenn es NICHT klappt--> dann sollte dein "Wenn nicht dann soll er mir nur sagen dass es nicht aktuell ist." starten.

-> Oder dein Backupkrams läuft zufällig.... wenn du mal dran denkst, auf "meinBackup" doppelzuklicken.
-> Dann hast du aber ohnehin keine Datei "von heute" gewährleistet.

Also... ???

Lass mal Details wie "FOR/F" oder "IF EXIST" weg und erklär mir bitte nochmal den Prozess.

Grüße
Biber
Member: ghostX
ghostX Jul 16, 2010 at 11:39:35 (UTC)
Goto Top
Hi Biber,

Sorry wollte dich nicht verwirren. Den ersten Code den ich gepostet hab brauchst du ja eigentlich nicht mehr zu beachten. Es ist ja was anderes was ich nun brauche. Hätte ich vllt ein neues Thema eröffnen sollen....


Zitat von @Biber:
Noch mal mit meinen Worten - neue Aufgabenstellung ist jetzt
  • ein bestimmtes Verzeichnis abgrasen <-- JA
  • und daraufhin prüfen, ob mindestens eine Datei mit heutigem Datum vorhanden ist? <-- JA
  • und wenn keine Datei von heute vorhanden ist, dann...??? <-- Dann gebe in der Logdatei aus dass der Backup nicht aktuell ist
...
-> Entweder dein Backupkrams läuft zeitgesteuert. <-- JA zeitgesteuert, jede nacht
Jeden Tach meinetwegen.
Dann kann es entweder a) klappen oder b) nicht klappen. <-- JA
Wenn es NICHT klappt--> dann sollte dein "Wenn nicht dann soll er mir nur sagen dass es nicht aktuell ist." starten. <-- JA


Also zusammengefasst: Überprüfe in einem Verzeichnis X ob eine beliebige Datei mit aktuellem Datum vorhanden ist, wenn nein, schreibe mir in die Logdatei "Backup nicht aktuell"
Member: Biber
Biber Jul 16, 2010 at 12:01:26 (UTC)
Goto Top
Ja nee, ghostX,

nicht dass ich mich drücken wollte vor dem Schreiben der geforderten Halbzeile, aber...

Ist Bullshit suboptimal aus meiner Sicht.
Egal wieviel Zeilen der Oneliner haber wird... es ist für dich ein zusätzlicher manueller (und damit fehlerträchtiger) Schritt.
Du musst eben diese Datei starten, sonst hast du die Info nicht.
Doppelklick zum Starten, eine beliebige Taste zum Meldung wegdrücken - sind zwei Schritte, die dich auf 200 Jahre hochgerechnet fast eine volle Arbeitswoche kosten - for nothing.

Wenn denn dein Backupkram jede Nacht vor sich hin dölmert, dann lass es doch
a) wenn das Backup klappt
- am Ende eine Datei mit dem klangvollen Namen "Aktuelles Backup vom 16.07.10 03:37h" auf dem Desktop anlegen
- und alle anderen Dateien auf dem Desktop mit dem Namen "Aktuelles Backup vom" löschen
b) wenn das Backup nicht klappt
- am Ende eine Datei auf dem Desktop anlegen mit dem Namen "Sorry ich bin am 16.07.10 in die Grütze gegangen - Dein Backup"
- und keine anderen Dateien löschen

Täglich laufende Bätche werden i.d.R. nicht dazu zusammengeschrotet, dass sie jeden gatesverdammten Tach gedoppelklickt werden.

Grüße
Biber
Member: ghostX
ghostX Jul 16, 2010 at 12:15:57 (UTC)
Goto Top
Hi Biber,

welche Windows Version benutzt du denn? Also so viel ich weiß gibt es ab Windows 98 eine Funktion die heißt "Geplante Tasks" face-wink
Die Batchdatei wird also nicht manuell (wär ja schlimm) sondern per geplanten Task täglich automatisch ausgeführt und die Logdatei auf einem Onlineportal angezeigt. Und das funktioniert auch alles so weit gut mit anderen Batchdateien...

Hatte ich nicht für nötig gehalten es zu erwähnen wie die Datei ausgeführt wird....
Member: Biber
Biber Jul 16, 2010 at 12:41:30 (UTC)
Goto Top
Moin ghostX,

na ja, wenn es denn sein soll...

Für die Anforderung
Also zusammengefasst:
Überprüfe in einem Verzeichnis X ob eine beliebige Datei mit aktuellem Datum vorhanden ist,
wenn nein, schreibe mir in die Logdatei "Backup nicht aktuell"

würde ich eine möglichst simple Prüfung vornehmen, also z.B.
dir z:\backups\2010\*.bkf|findstr /b "%date%">nul && @echo Datei *.bkf vom %date% liegt vor >>d:\eine\Logdatei  
-bzw-
dir z:\backups\2010\*.bkf|findstr /b "%date%">nul || @echo KEIN Backup vom %date% vorhanden. >>d:\eine\Logdatei  

Die "DIR z:\backups\2010\*.bkf" muss du anpassen... kannst aber genau diesen Befehl auch am CMD-Prompt antesten.
Wenn dabei überhaupt *.bkf (oder welche Endung du verwendest) gefunden werden, dann steht das Dateidatum am Anfang der Zeile.
Am Anfang der Zeile prüft FindStr.exe mit dem Parameter /b
Das doppelte Ampersand (&&) bedeutet soviel wie "Wenn es geklappt hat, dann tue.."

Grüße
Biber

P.S. Ich hab sogar schon Windows 99 Professional
Member: ghostX
ghostX Jul 16, 2010 at 15:26:40 (UTC)
Goto Top
Hi Biber,

danke jetzt passt es face-smile

Wie funktioniert es eigentlich wenn ich mehrere Verzeichnisse durchsuchen will? Muss ich die dann in eine Variable packen und anstelle von "dir" die Variable an der entsprechenden Stelle aufrufen? Habe es nicht hinbekommen

Und was muss ich machen falls keine aktuelle Datei in einem der Verzeichnisse vorhanden ist, dass das betroffene Verzeichnis in der Logdatei mit drin steht --> "Kein aktuelles Backup vorhanden in Verzeichnis1"
Es bringt ja nix wenn ich dann alle Verzeichnisse trotzdem manuell durchsuchen muss um rauszukriegen wo es fehlt.
Member: Biber
Biber Jul 16, 2010 at 16:23:51 (UTC)
Goto Top
Moin ghostX,

ich liebe es, wenn man Laufe einer entspannten Plauderei von Ästlein auf Zweiglein kommt
oder im Laufe eines Zentimeter um Zentimeter wachsenden Threads so langsam vom Abstrakten aufs Konkrete... face-wink

Ganz ganz weit oben hatten wir mal begonnen mit einer Dummy-Version, die nach einem
Set Dateien="C:\Dateien\*"
ein flaches Wackel-mal-über-die-Dateien macht mit
for %%i in (%Dateien%)

Okay, jetzt sind wir gefühlte 53cm weiter in Thread... dann lass uns doch mal ein bisschen realistischer werden.

Konkret:
Was hast du dir für eine Sicherungsverzeichnisstruktur ausgedacht?
Gibt es irgendwo ein "Rootverzeichnis" für alle Sicherungen (meinetwegen "F:\Sicherungen\" ) ? Oder drei verschiedene?
Und darunter dann eine Struktur wie
.F:\Sicherungen\UnsaServer
.F:\Sicherungen\UnsaServer\Daily
.F:\Sicherungen\UnsaServer\Monat
.F:\Sicherungen\UnsaServer\Archiv
.F:\Sicherungen\Shakira\Privat
.F:\Sicherungen\LaufwerkD\HanniUndNanni

Und wenn anders, wie?
Welche Verzeichnisse sollen berücksichtigt, welche ignoriert werden?
Welche Dateiendungen sollen berücksichtigt, welche ignoriert werden?

Menno, lass mich doch hier nicht so lange rumraten - du hast doch eine konkrete Vorstellung.
Und wir hier im Forum können doch nur das Handwerkliche beisteuern, wenn wir nun wissen, ob du nageln oder schrauben willst.
Bzw. ob wir einen Hammer für kleine Nägel mitbringen müssen oder eine Schlagbohrmaschine für größe Nägel.
Oder ein paar Wattebällchen für Rigipsplatten-Nägel.

Ich mag jedenfalls nicht auf abstrakter Ebene irgendwelche theoretischen rekursiven Schleifen drehen.
Wenn ich das wollte, dann wäre ich in die FDP eingetreten.

Grüße
Biber
Member: ghostX
ghostX Jul 16, 2010 at 17:02:28 (UTC)
Goto Top
Zitat von @Biber:
Ganz ganz weit oben hatten wir mal begonnen mit einer Dummy-Version, die nach einem
> Set Dateien="C:\Dateien\*"
ein flaches Wackel-mal-über-die-Dateien macht mit
> for %%i in (%Dateien%)

genau so hatte ichs mir vorgestellt:
Set Dateien="C:\SicherungenA\*","C:\SicherungenB\*","C:\SicherungenX\*"

Gibt es irgendwo ein "Rootverzeichnis" für alle Sicherungen (meinetwegen "F:\Sicherungen\" ) ? Oder drei
verschiedene?

Nein es gibt kein Rootverzeichnis. Es sind mehrere verschiedene Verzeichnisse, Laufwerke oder sogar verschiedene PC´s mit IP angabe (\\171.1.2.3\c$\*)

Welche Verzeichnisse sollen berücksichtigt, welche ignoriert werden?

Alle Verzeichnisse die ich aufliste

Welche Dateiendungen sollen berücksichtigt, welche ignoriert werden?

Was für eine Rolle spielen denn die Dateiendungen wenn ich sage: Suche Verzeichnis C:\SicherungenB\*
Es sollen alle Dateien in den angegebenen Verzeichnissen berücksichtigt werden, nicht mehr und nicht weniger

Oder ein paar Wattebällchen für Rigipsplatten-Nägel.

Was?? face-smile

Wenn ich das wollte, dann wäre ich in die FDP eingetreten.

Über Politik kann ich dir nicht viel sagen, ich weiß nur dass die da oben alles Geldgeier sind.

Grüße
Member: Biber
Biber Jul 16, 2010 at 17:42:19 (UTC)
Goto Top
Ahhhhhhh, ghostX,

jetzt hab ich das verstanden, dass in diesem "Set dateien=..." auch eine Liste von Verzeichnissen stehen kann.

Okay, dann nehmen wir doch eines der naheliegenden, aber undokumentierten Features der FOR /D-Anweisung.

Wenn du dieser Demo am CMD-Prompt folgst:
>for /d %i In (d:\temp\,d:\tmpdn\,d:\work\) do @dir /b /a:-d /s %i 2>nul
d:\temp\103306.BAN.multi.pdf
d:\temp\alleDwgs.txt
d:\temp\wemdas.cmd
d:\temp\wemdas.txt
d:\temp\WemdasAuswertung.txt
d:\tmpdn\DebugView.zip
d:\tmpdn\disk-defrag-setup.exe
d:\tmpdn\OOo_3.2.1_Win_x86_install_de.exe
d:\tmpdn\ProcessExplorer.zip
d:\tmpdn\ProcessMonitor.zip
d:\tmpdn\seamonkey-2.0.5.zip
d:\tmpdn\vb_web.exe
d:\tmpdn\werkzeuge.xls
d:\tmpdn\DebugView\dbgview.chm
d:\tmpdn\DebugView\Dbgview.exe
d:\tmpdn\DebugView\Eula.txt
d:\work\Dougknox.vbs
...dann siehst du die Änderung, die du oben bei dir im Schnipsel machen musst.
Ich mache ja hier genau das, was du angefragt hast
for /d %i In (d:\temp\,d:\tmpdn\,d:\work\) do @dir /b /a:-d /s %i 2>nul

-> FOR /D %i .... Wackele über alle Directorys (daher das /D)
-> die ich in der Klammer aufzähle... entspricht deiner Liste in "Set Dateien=d:\temp\,d:\tmpdn\,d:\work\"
-> DO irgendwas .... und zwar genau diese DIR+Findstr-Zeile aus dem vorangegangenen Kommentar.
Neu dazu gekommen ist jetzt nur das "2>nul" nach dem DIR ---> das ist nur kosmetisch, um alle "Keine Dateien gefunden"-Meldungen bei leeren Verzeichnissen auszublenden. [ist bei dir egal - du filterst ohnehin nach "Datum heute" alles weg.

Da, wo in der Demo am CMD-Prompt EIN %i steht, muss im Batch %%i stehen.

Grüße
Biber