Dateien aus einer Abfrage ausschließen
Hallo Gemeinde,
habe eine Frage ...(was sonst?) )
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:
habe eine Frage ...(was sonst?) )
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%"
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 146978
Url: https://administrator.de/contentid/146978
Ausgedruckt am: 23.11.2024 um 05:11 Uhr
12 Kommentare
Neuester Kommentar
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:
Falls der Ausschluss sich aler auf Wildcards bezieht (alle "*.sik" oder alle "final*.*"-Dateien, dann wäre ein anderes Vorgehen sinnvoll.
Grüße
Biber
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
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
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
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
Moin ghostX,
es mag an der langen und heißen Woche voller Montage liegen, aber....
Noch mal mit meinen Worten - neue Aufgabenstellung ist jetzt
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
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.
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
Ja nee, ghostX,
nicht dass ich mich drücken wollte vor dem Schreiben der geforderten Halbzeile, aber...
IstBullshit 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
nicht dass ich mich drücken wollte vor dem Schreiben der geforderten Halbzeile, aber...
Ist
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
Moin ghostX,
na ja, wenn es denn sein soll...
Für die Anforderung
würde ich eine möglichst simple Prüfung vornehmen, also z.B.
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
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"
Ü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
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...
Ganz ganz weit oben hatten wir mal begonnen mit einer Dummy-Version, die nach einem
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
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...
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 mitfor %%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
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:
...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 .... 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
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
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