Veröffentlicht 28. Februar 200520 j hallo, anforderung: 1 x pro tag soll die batch datei die größe eines netzlaufwerkes messen. realisierung: batch datei schreibt dies in eine csv-datei. (1. zeile datum, 2. zeile größe in gb z.B.) hat jemand erfahrungen? andere ideen? gruss, danke!
1. März 200520 j Damit bekommst du die Grösse: @ECHO OFF SET verz=D:\TEMP SET groesse=0 FOR /F "tokens=*" %%a IN ('DIR /S /A-D /B %verz%\*.*') DO ( SET /A groesse+=%%~za ) IF /I %groesse% GTR 1073741824 ( SET /A nachkomma=%groesse% %% 1073741824 SET /A groesse/= 1073741824 SET unit=GB ) ELSE ( IF /I %groesse% GTR 1048576 ( SET /A nachkomma=%groesse% %% 1048576 SET /A groesse/= 1048576 SET unit=MB ) ELSE ( IF /I %groesse% GTR 1024 ( SET /A nachkomma=%groesse% %% 1024 SET /A groesse/=1024 SET unit=kB ) ELSE ( SET /A nachkomma=0 SET unit=B ) ) ) ECHO Groesse: %groesse%,%nachkomma:~0,2%%unit% Datum & Umleitung in eine Datei solltest du mit der SuchFunktion locker finden können.
1. März 200520 j Unter welchen Betriebssystemläuft die Batch ? Für 2k und XP mach das: @ECHO OFF SET verz=D:\TEMP SET groesse=0 FOR /F "tokens=*" %%a IN ('DIR /S /A-D /B %verz%\*.*') DO ( SET /A groesse+=%%~za ) IF /I %groesse% GTR 1073741824 ( SET /A nachkomma=%groesse% %% 1073741824 SET /A groesse/= 1073741824 SET unit=GB ) ELSE ( IF /I %groesse% GTR 1048576 ( SET /A nachkomma=%groesse% %% 1048576 SET /A groesse/= 1048576 SET unit=MB ) ELSE ( IF /I %groesse% GTR 1024 ( SET /A nachkomma=%groesse% %% 1024 SET /A groesse/=1024 SET unit=kB ) ELSE ( SET /A nachkomma=0 SET unit=B ) ) ) echo %DATE% >> C:\csvdatei.txt echo %TIME% >> C:\csvdatei.txt ECHO Groesse: %groesse%,%nachkomma:~0,2%%unit% >> C:\csvdatei.txt
1. März 200520 j läuft... nur zum verständnis würde ich gerne wissen, was die befehle bedeuten, falls es für dich ncith zu viel arbeit ist... vlt kleine kommentare? wäre sehr nett! gruss
1. März 200520 j REM Keine Ausgaben @ECHO OFF REM Variable verz setzen (mit dem Pfad des zu messendem Ordners) REM Variable groesse auf 0 setzen. SET verz=D:\TEMP SET groesse=0 REM Von jeder Datei in dem Ordner (und dem Unterordner) die Dateigröße REM auslesen und addieren. groesse=Summe aller Dateigrößen FOR /F "tokens=*" %%a IN ('DIR /S /A-D /B %verz%\*.*') DO ( SET /A groesse+=%%~za ) REM Wenn groesse = (GTR) größer als 1073741824 dann REM handelt es sich um Gigabyte. Nachkomma errechnen IF /I %groesse% GTR 1073741824 ( SET /A nachkomma=%groesse% %% 1073741824 SET /A groesse/= 1073741824 SET unit=GB ) REM Wenn groesse größer 1048576 dann handelt es sich um MegaByte ELSE ( IF /I %groesse% GTR 1048576 ( SET /A nachkomma=%groesse% %% 1048576 SET /A groesse/= 1048576 SET unit=MB ) ELSE ( IF /I %groesse% GTR 1024 ( SET /A nachkomma=%groesse% %% 1024 SET /A groesse/=1024 SET unit=kB ) ELSE ( SET /A nachkomma=0 SET unit=B ) ) ) REM Ausgabe von Date und Time und groesse in Datei umleiten echo %DATE% >> C:\csvdatei.txt echo %TIME% >> C:\csvdatei.txt ECHO Groesse: %groesse%,%nachkomma:~0,2%%unit% >> C:\csvdatei.txt
1. März 200520 j hey super, danke! ich hätte noch ein frage... ich habe es gerade mal "produktiv" getestet. es ist ein netzlaufwerk, was 300 GB kapatzitätn hat, jedoch sind davon 201 GB belegt. wenn ich das script laufen lasse, ist meine cpu 15 min bei 100%! gibt es eine andere möglichkeit das zu testen? es reicht aus, zu wissen, wieviel auf dem netzlaufwerk belegt ist. thx!
1. März 200520 j ich denke da wirst du mit einer Batch-Datei nicht sehr weit kommen. Es gibt eine Software "Hyena" dort ist ein Tool, welches ressourchen-schonender arbeitet und dir auch die Auslastung des Laufwerkes in Prozent angibt.. Ich komm gerad nicht auf den Namen auf der .exe - Datei.... Schau dir mal Hyena an....
1. März 200520 j hyena kenne ich... was mir wichtig ist, dass eine .csv erstellt wird, aus der dann die daten zum reporting (wachstumsrate) von einem anderen tool gelesen werden.... vorschlag? *g*
1. März 200520 j Natürlich hat das Script eine schlechte Laufzeit und Performance. Das Skript geht jeden Ordner auf dem Laufwerk durch und addiert alle Dateigrössen. Mehr Sinn würde es bestimmt machen, ein Programm auf dem Server einzusetzen - unter Linux z.B. df.
1. März 200520 j ich bin gerade dabeie Batchdatei zu basteln, die ein "dir C: /-C" ausführt. Am Ende von dir steht dann viele Bytes noch frei sind, auf dem Laufwerk. Mit den Bytes wird dann ausgerechten wieviel MB, GB etc. dass sind. Und so'n dir Befehl is schnell abgearbeitet :-)
2. März 200520 j @echo off REM zu überwachendes Laufwek auswählen: set LW=c:\ dir %LW% /-C >>C:\temp\dirausgabe.txt SET groesse=0 SET groesseneu=0 for /f "tokens=*" %%b in (c:\temp\dirausgabe.txt) do (SET /A groesseneu+=1) SET /A groesseneu+=1 dir %LW% /-C| more +%groesseneu% >> C:\temp\groessedir.txt FOR /F "tokens=2,3* delims=," %%i IN (C:\temp\groessedir.txt) DO (echo %%i >>C:\temp\beschneidung1.txt) FOR /F %%k IN (C:\temp\beschneidung1.txt) DO (echo %%k >>C:\temp\beschneidung2.txt) FOR /F %%k IN (C:\temp\beschneidung2.txt) DO (SET groesse=%%k) cls echo %groesse% Byte freier Speicher auf Laufwerk %LW% echo. echo. pause del C:\temp\dirausgabe.txt del C:\temp\groessedir.txt del C:\temp\beschneidung1.txt del C:\temp\beschneidung2.txt Jetzt muss "nur noch" die Funktion von _Martin_ eingebaut werden, die dir aus den Bytes (Variable %groesse%) den freien Speicher in GB,MB etc. ausrechnet. Da bin ich aber nebenbei dran.
2. März 200520 j Hier nochmal Code-Tuning @echo off REM zu überwachendes Laufwek auswählen: set LW=c:\ dir %LW% /-C >>C:\temp\dirausgabe.txt SET groesse=0 SET groesseneu=0 for /f "tokens=*" %%b in (c:\temp\dirausgabe.txt) do (SET /A groesseneu+=1) SET /A groesseneu+=1 dir %LW% /-C| more +%groesseneu% >> C:\temp\groessedir.txt FOR /F "tokens=2,3* delims=," %%i IN (C:\temp\groessedir.txt) DO (echo %%i >>C:\temp\beschneidung1.txt) FOR /F %%k IN (C:\temp\beschneidung1.txt) DO (SET groesse=%%k) cls echo %groesse% Byte freier Speicher auf Laufwerk %LW% echo. echo. pause del C:\temp\dirausgabe.txt del C:\temp\groessedir.txt del C:\temp\beschneidung1.txt
2. März 200520 j danke... warum werden die dateien alle gelöscht, wenn ich später ne taste drücke? die daten sollen aj einmal täglich in die datei geschrieben werden. also ist später die beschneidung.scv (*g*) die ausschlaggebene datei. jetzt müsste in der csv noch stehen. z.b. 02.03.2005 116 GB wieso kannst du so gut batch proggen?! ich will auch *g* hut ab
2. März 200520 j warum werden die dateien alle gelöscht, wenn ich später ne taste drücke? die daten sollen aj einmal täglich in die datei geschrieben werden. Diese Dateien sind temporäre Dateien, die werden nur für das ausrechnen der Bytes (oder vielmehr dass suchen der Bytes) gebraucht. Die CSV Datei wird anschließend erstellt, wenn aus den Bytes die MB oder GB ausgerechnet wurden. (Also Step-by-Step also ist später die beschneidung.scv (*g*) die ausschlaggebene datei. nein.... 02.03.2005 116 GB Das bekommst du hin,wenn du am Ende der Batch schreibst: echo Groesse: %groesse%,%nachkomma:~0,2%%unit% >> CSVdate.csv echo %date% >> CSVdate.csv echo %time% >> CSVdate.csv so kannst du dir ne schöne CSV Datei basteln. Wenn du Kommata als Trennzeichen brauchts, dann änder den echo Befehl: echo Groesse: %groesse%,%nachkomma:~0,2%%unit%, >> CSVdate.csv echo %date%, >> CSVdate.csv echo %time%, >> CSVdate.csv
2. März 200520 j @echo off REM zu überwachendes Laufwek auswählen: REM ---------------------------------- set LW=e:\ REM einen Dir-Befehl ohne Tausender-Trennzeichen REM in die Datei C:\temp\dirausgabe.txt schreiben REM ----------------------------------- dir %LW% /-C >>C:\temp\dirausgabe.txt REM Variablen erzeugen und auf "0" setzen REM ----------------------------------- SET groesse=0 SET groesseneu=0 REM Die Zeilen in c:\temp\dirausgabe.txt zählen REM (Variable groesseneu pro Zeile um 1 hochzählen) REM --------------------------------- for /f "tokens=*" %%b in (c:\temp\dirausgabe.txt) do (SET /A groesseneu+=1) REM Variable groesseneu nochmal um 1 erhöhen REM ----------------------------------------- SET /A groesseneu+=1 REM wieder ein Dir ohne Tausender-Trennzeichen, diesmal nur die Letzte Zeile in REM die Datei C:\temp\groessedir.txt schreiben REM ---------------------------------------------- dir %LW% /-C| more +%groesseneu% >> C:\temp\groessedir.txt REM Aus der letzten zeile von "dir" nur die erste Zahl (Anazhl Bytes) auslesen REM und in Datei C:\temp\beschneidung1.txt speichern. REM ---------------------------------------------------------- FOR /F "tokens=2,3* delims=," %%i IN (C:\temp\groessedir.txt) DO (echo %%i >>C:\temp\beschneidung1.txt) REM DIe Anzahl der Bytes in die Variable "groesse" einlesen REM groesse = Bytes REM ----------------------------------------------------------- FOR /F %%k IN (C:\temp\beschneidung1.txt) DO (SET groesse=%%k) REM CLS = ClearScreen - Bildschirm säubern cls echo %groesse% Byte freier Speicher auf Laufwerk %LW% echo. echo. pause REM Temporäre Arbeitsdateien löschen. REM --------------------------------- del C:\temp\dirausgabe.txt del C:\temp\groessedir.txt del C:\temp\beschneidung1.txt REM Bytes in GB, MB etc. umrechnen REM -------------------------------- IF /I %groesse% GTR 1073741824 ( SET /A nachkomma=%groesse% %% 1073741824 SET /A groesse/= 1073741824 SET unit=GB ) ELSE ( IF /I %groesse% GTR 1048576 ( SET /A nachkomma=%groesse% %% 1048576 SET /A groesse/= 1048576 SET unit=MB ) ELSE ( IF /I %groesse% GTR 1024 ( SET /A nachkomma=%groesse% %% 1024 SET /A groesse/=1024 SET unit=kB ) ELSE ( SET /A nachkomma=0 SET unit=B ) ) ) ECHO Groesse: %groesse%,%nachkomma:~0,2%%unit% frei auf LW %LW% >> CSV.csv ECHO gemessen am: %DATE% >> CSV.csv ECHO um: %TIME% Uhr >> CSV.csv pause Irgenwie klappt dass umrechnen der Bytes bei mir nicht... Hab ich da n DEnkfehler drin? Oder wird die Variable "groesse" einfach zu lang? Irgendwie steh ich jetzt aufn Schlauch.... Es funkioniert bis REM Bytes in GB, MB etc. umrechnen REM -------------------------------- Danach werden die Bytes nicht korrekt umgerechnet. Ne Idee ?
3. März 200520 j also, Set /A %groesse%/=13554656(was auch immer) funktioniert, wenn %groesse% nicht größer ist als 1000000000..... das ist das Problem. Anscheinend is das nur eine 4Byte Variable.... WIe kann ich in einer Batch-Datei Variablen deklarieren? Geht das überhaupt? *BlödGuck*
4. März 200520 j Nein, in Batch gibt es keine Variablendeklarationen. Du hast Recht, mit grossen Zahlen kann der SET /A Befehl nicht umgehen - IF GTR allerdings schon. Die Berechnung der Nachkommastelle ist aber sowieso falsch, habe ich gerade gemerkt :floet: Beispiel: eine %groesse% von 1024 ist 1 KByte, dementsprechend sollte bei einer %groesse% von 1033 auch 1 KByte rauskommen (die 9 Byte mehr sollen durch Rundung auf 2 Nachkommastellen nicht angezeigt werden). Da ich aber den Modulo Operator (%%) benutze, kommt natürlich für %nachkomma% 9 raus, so dass später 1,9 KByte rauskommen - was falsch ist. Das wirkt sich später noch verheerender aus (1,9 GB statt 1 GB....) Ich merke mal wieder, wie Batch an seine Grenzen stösst. Vielleicht lässt sich noch was drehen, indem man die Zahl %groesse% verkürzt... ich melde mich später nochmal.
4. März 200520 j Es geht schon, allerdings immer noch mit einem Rundungsfehler und ist recht umständlich. Ich poste erstmal den Code: @ECHO OFF REM -- Pruefen, ob verzoegerte Variablenerweiterung aktiviert ist SET TEST=TEST IF NOT !TEST!==TEST ( ECHO Die verzoegerte Variablenerweiterung ist nicht aktiviert! ECHO Es wird eine neue Shell mit aktivierter Erweiterung gestartet ECHO und die Batchdatei darin ausgefuehrt. START "Ermittlung freier Speicherplatz" cmd /v /c bla.bat GOTO :EOF ) SET groesse=106300440570 IF /I !groesse! GTR 1073741824 ( REM -- groesser als 1 GB. Da SET nicht mit so grossen Zahlen rechnen kann, REM -- werden die irrelevanten Bytes gelöscht SET groesse=!groesse:~0,-3! ECHO !groesse! SET /A nachkomma=^(!groesse! %% 1048576 ^) * 100 / 1048576 SET /A groesse/=1048576 SET unit=GB ) ELSE ( IF /I !groesse! GTR 1048576 ( SET /A nachkomma=!groesse! %% 1048576 * 100 / 1048576 SET /A groesse/= 1048576 SET unit=MB ) ELSE ( IF /I !groesse! GTR 1024 ( SET /A nachkomma=!groesse! %% 1024 SET /A groesse/=1024 SET unit=kB ) ELSE ( SET /A nachkomma=0 SET unit=B ) ) ) ECHO Groesse: !groesse!,!nachkomma!!unit! pause Ich verwende hier die verzögerte Variablenauswertung. Der Grund ist das Wegschneiden der letzten 3 Stellen, wenn die Grösse mehr als 1G ist. Das ist wiederum eine Einschränkung der Batch: die Variable %groesse% wird beim ersten SET dateiweit festgelegt, eine nachträgliche Änderung wirkt sich nicht aus. Siehe auch dieses Beispiel aus der Hilfe: Die verzögerte Erweiterung von Variablen verbessert die Möglichkeiten der Variablenerweiterung. Bisher wurden die Variablen beim Lesen des Texts, und nicht bei dessen Ausführung, erweitert. Das folgende Beispiel zeigt ein Problem, das dabei auftritt: set VAR=vorher if "%VAR%" == "vorher" ( set VAR=nachher; if "%VAR%" == "nachher" @echo Es funktioniert! ) Die Meldung würde nie angezeigt, weil %VAR% in beiden IF-Befehlen beim Lesen des ersten IF-Befehls erweitert wird, weil es logisch zu diesem gehört. Daher vergleicht der zweite IF-Befehl "vorher" mit "nachher" was nie gleich sein kann. Aber auch damit ergibt sich noch ein Rundungsfehler, hier bei den 99,9 GB immer noch fast 1,5 GB. Also -> nicht tragbar. Mein Rat: vergiss die Umrechnung in GB etc. Schreib einfach nur das Datum und die Grösse (in Bytes) in die CSV und lass die Auswertung von einem Programm machen, Excel oder sowas. In einer CSV gehören die Werte übrigens in eine Zeile, sonst macht das keinen Sinn und du hast es bei der Auswertung später schwer.
4. März 200520 j Das verkleinern von %groesse% ist IMHO die einzige Möglichkeit. Allerdings kann man dort ja nicht einfach ein paar Stellen "wegkürzen". Wenn groesse einen Wert von 2 Millarden hat ist es ebenso nicht möglich den Wert einfach durch 2 zu teilen und die beiden Summen wieder zu addieren, da das Kind dann ja schon in den Brunnen gefallen ist (%groesse% wird ja direkt eingelesen, und nicht errechnet) Ich persönlich glaube nicht (mehr) daran, dass es eine Möglichkeit gibt, mit solch langen Zahlen und mit SET /A mathematisch zu rechnen........
10. März 200520 j hi, danke für eure mühe... habt ihr denn mal das scipt in voller pracht da?! würde es gerne mal probieren... mal schauen, wie groß die abweichung ist... thx
10. März 200520 j Du musst einfach nur den letzten Code von _MArtin_ und "meinen" Code zusammenschneiden. Bei "meinem" Code lässt du alles ab "Größe ausrechnen" weg und packst da _Martins_ Code drunter.
10. März 200520 j Der letzte Code von mir ist keineswegs komplett oder richtig, also benutze ihn nicht.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.