painkillerpro
Goto Top

Batch für Serverabfrage von geänderten Dateien, Auslesen Änderungsdatum von Dateien

Mein Anliegen für nen batch-file ist ein bisschen mehr...

Ich benötige ein Batch-File zur Abfrage von Dateien in einer Ordnerstruktur auf einem Server. Der bat-file selbst soll aber nicht auf dem Server liegen, der abgefragt werden soll. Hierfür soll ein Account für den Serverzugriff mitgegeben werden.

Genauer:

Auf abzufragendem Server liegen Ordner (inkl. Unterordner). In diesen Ordnern befinden sich Backup-Dateien, die auf ihre Aktualität überpürft werden sollen.
Wenn die Dateien (alle verfügbaren Dateien in den Ordnern/Unterordner älter als x Tage sind, sollen diese Dateien in ein log-file geschrieben werden und dieser dann per Email an eine bestimmte Person (Systemadministrator verschickt werden). Wenn die Dateien aber jünger als x Tage sind, soll keine Benachrichtigung erfolgen.

So könnte die Routine aussehen:

- Authentifizierung auf Server, um Ordner/Unterordner nach Dateien inklusive ihres Änderungsdatums zu überprüfen (Überprüfung evtl mit WasFile.exe)
- wenn Änderungsdatum jeder einzelnen Datei in Ordner mehr als x Tage zurückliegt, Datei in log-file schreiben, ansonsten keine Information
- log-file über SMTP-Server an verschiedene Empfänger verschicken (schon realisiert über smtpmail.exe)

Wäre echt toll, wenn jemand einen Lösungsvorschlag, vorallem für die Authenifizierung und die Abfrage der Dateien in Ordnerstrukur auf dem Server hat und für die Überprüfung des Änderungsdatums. Am besten wäre es natürlich, wenn in dem log-file alle Dateien enthalten sind, die älter als x Tage sind, und dahinter aufgelistet wird, wann sie denn zum letzten mal geändert wurden.

z.b.

file1.exe zuletzt geändert am 12.06.08
file2.stc zuletzt geändert am 08.02.07

Danke schon mal im Vorraus für eure Ansätze...

Mfg painkillerpro

Content-Key: 92170

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

Ausgedruckt am: 28.03.2024 um 11:03 Uhr

Mitglied: Nailara
Nailara 16.07.2008 um 13:33:42 Uhr
Goto Top
Hi,

Authentifikation ist nicht schlimm:

net use \\<servername>\ipc$ <klartextpasswort> /user:<domäne>\<username>

Die jeweiligen Sachen sind einfach passend zu ersetzen - das natürlich ohne < und > face-wink. Wenn es eine Freigabe gibt, auf die man sich authentifizieren kann, dann heisst das eben

net use \\<servername>\<freigabe> <klartextpasswort> /user:<domäne>\<username>

Achtung beim Testen: es kann nur einmal eine Anmeldung in einem Benutzerkontext auf die Ressource gemacht werden - schaust Du also zuerst mal mit dem Explorer nach, was so abgeht, dann funktioniert das net use nicht mehr. Dann hilft

net use \\<server>\<freigabe> /delete

Für die Dateisuche gibt es das Kommando find - damit kann man schon mal eine Menge machen. Manchmal reicht das nicht und da gibt es auf sourceforge.net die UnixUtils - das sind nativ portierte Unixkommandos. Eins davon ist auch find und da kannste mit -atime, -mtime und -ctime sowie einer Zahl dahinter sehr fein steuern, wie alt die Datei sein darf/soll.

Das geht dann etwas so:

find C:\ -ctime +3 > logfile.log 2> errorfile.log

-ctime +3 sagt: alle Dateien, deren Erstellungsdatum mehr als drei Tage her ist.
-citme -3 würde sagen: alle Dateien, deren Erstellungsdatum jünger als drei Tage ...

Mit dem Unix-find und der Option -exec könntest Du es mit ein wenig Überlegung auch schaffen, die entsprechenden Log-Dateien, die älter sind als n Tage, einfach löschen oder komprimieren oder was auch immer machen zu lassen....

Grüße Mathias
Mitglied: painkillerpro
painkillerpro 16.07.2008 um 14:37:37 Uhr
Goto Top
danke erstma...

das mit der freigabe hat geklappt.

jetzt musst du mir das nur mal mit den unixutils erklären, die sind ja bestimmt nicht standardmäßig auf nem windows2003 server implementiert??!!
gibt es vllt auch ne andere möglichkeit??
und wie bekomme ich das letzte änderungsdatum der datei in den log-file... bzw. wie kann ich das auslesen??

die log-files werden immer wieder neu erstellt, und ausgelesen und der inhalt über mail verschickt!!
mir geht es nur darum, dass die namen der dateien inkl. letztes änderungsdatum in den log-file kommen und auch alle unterverzeichnisse durchsucht werden...

danke erstma für eure hilfe...
Mitglied: Nailara
Nailara 16.07.2008 um 14:41:14 Uhr
Goto Top
Hi,

prima - ein Schritt weiter face-smile

Die UnixUtils findest Du unter http://unxutils.sourceforge.net/. Das ist ein ZIP-File, das kannste runterladen und dann das Programm find aus /usr/local/wbin herausextahieren.

In der Tat ist es auf Windows erstmal nicht vorhanden - die Tools sind native Ports von Linuxprogrammen und wie wir MS kennen ... naja.

'ne andere Idee - also hab ich jetzt erstmal nicht. Vielleicht kann man das mit dem Windows Find auch machen, doch da bin ich unsicher...


Grüße Mathias
Mitglied: painkillerpro
painkillerpro 16.07.2008 um 14:50:00 Uhr
Goto Top
wäre es denn möglich, alle dateien in ordner/unterordnern über ne for-schleife mit dem befehl "dir" auszulesen:

Für alle durchsuchten Dateien in Ordner/Unterverzeichnissen tue etwas??!! so in der art...

die realisierung über das alter einer datei kann ich auch über wasfile.exe realisieren, wüsste aber ni, wie die for-schleife und die aufzurufende prozudur/unterprogramm auszusehen hätten.

for /f "delims=" %%i in ('dir /b /a-d /od "%WORKDIR%\%tools%\*.*"') do set "Zieldatei=%WORKDIR%\%tools%\%%i"

"%WORKDIR%\%tools%\WasFile.exe" %Zieldatei% modified after today-%LastModified% >> backup.log
if not errorlevel 1 goto :TRUE >> backup.log

--> funktioniert aber ni...

die schleife soll eigentlich jede einzelne datei auslesen und den namen+endung (text.txt) in die variable "Zieldatei" schreiben. für diese variable wird dann über wasfile.exe das alter geprüft.
ich will eigentlich nur, dass die routine für jede einzelne gefundene datei durchläuft, aber keine ahnung wie das geht!! hhelft mir bitte...

ich hoffe es ist verständlich...

danke!!
Mitglied: bastla
bastla 20.07.2008 um 19:41:58 Uhr
Goto Top
Hallo painkillerpro!

Eine eigene Variable zu verwenden wäre zwar auch möglich, aber eigentlich genügt auch die Laufvariable %%i der "for"-Schleife.

Falls Du auch Unterverzeichnisse mit erfassen möchtest, bräuchtest Du beim "dir" noch "/s" - dann enthielte übrigens %%i immer den vollen Pfad, und Du kämst mit "%%~nxi" zu Dateiname + Extension; wenn sich, wie in der aktuellen Version, das "dir" nur auf ein bestimmtes Verzeichnis bezieht, steht in %%i ohenhin kein Pfad.

Je nachdem, was Du noch alles vorhast, kannst Du entweder gleich alles in der Schleife selbst erledigen:
for /f "delims=" %%i in ('dir /b /a-d /od "%WORKDIR%\%tools%\*.*"') do "%WORKDIR%\%tools%\WasFile.exe" %Zieldatei% modified after today-%LastModified% >> backup.log && echo hier die Aktion für Errorlevel 0 für die Datei "%%i"  
oder Du verwendest ein Unterprogramm:
for /f "delims=" %%i in ('dir /b /a-d /od "%WORKDIR%\%tools%\*.*"') do call :ProcessFile "%%i"  
echo Fertig.
goto :eof

:ProcessFile
:: Die beim Aufruf des Unterprogramms übergebene Datei ist hier %1
"%WORKDIR%\%tools%\WasFile.exe" "%WORKDIR%\%tools%\%~1" modified after today-%LastModified% >> backup.log  
if not errorlevel 1 goto :TRUE >> backup.log
...
...
goto :eof

:TRUE
...
...
goto :eof
Grüße
bastla
Mitglied: painkillerpro
painkillerpro 20.07.2008 um 23:35:42 Uhr
Goto Top
danke... hat mir sehr geholfen...
funktioniert!!

jetzt müsste ich nur noch wissen, ob ich auch das letzte änderungsdatum direkt auslesen kann? jetzt prüfe ich ja nur, in welchem zeitraum zuletzt geändert wurde! is zwar auch n kriterium, wäre aber spitze, wenn ich das änderungsdatum auslesen könnte!! (evtl. funktioniert das auch über nen vbs-skript in dem batch-file, keine ahnung, wie das funktioniert??)

dankeschön

mfg painkillerpro
Mitglied: bastla
bastla 20.07.2008 um 23:47:31 Uhr
Goto Top
Hallo painkillerpro!

jetzt müsste ich nur noch wissen, ob ich auch das letzte änderungsdatum direkt auslesen kann?
Auch dazu kannst Du auf %%i zurückgreifen:
for /f "delims=" %%i in ('dir /b /a-d /od "%WORKDIR%\%tools%\*.*"') do echo %%~ti  
Oder gleich mit einem Zerlegungsbeispiel:
for /f "delims=" %%i in ('dir /b /a-d /od "%WORKDIR%\%tools%\*.*"') do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do echo "%%i" zuletzt geaendert: %%c-%%b-%%a  
Was Du übrigens noch so alles mit der Schleifenvariable anstellen könntest, siehst Du am Ende der Online-Hilfe zu "for" (mit "for /?").

Grüße
bastla
Mitglied: painkillerpro
painkillerpro 21.07.2008 um 00:38:14 Uhr
Goto Top
thanks!! werd ich morgen früh gleich ma ausprobieren!!
besten dank bastla!!