SySi2001 Geschrieben 28. Februar 2005 Teilen Geschrieben 28. Februar 2005 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 1. März 2005 Teilen Geschrieben 1. März 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 1. März 2005 Teilen Geschrieben 1. März 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 1. März 2005 Autor Teilen Geschrieben 1. März 2005 thx, mal schauen, ob es funkt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 1. März 2005 Autor Teilen Geschrieben 1. März 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 1. März 2005 Teilen Geschrieben 1. März 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 1. März 2005 Autor Teilen Geschrieben 1. März 2005 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 1. März 2005 Teilen Geschrieben 1. März 2005 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.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 1. März 2005 Autor Teilen Geschrieben 1. März 2005 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* Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 1. März 2005 Teilen Geschrieben 1. März 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 1. März 2005 Teilen Geschrieben 1. März 2005 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 :-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 2. März 2005 Autor Teilen Geschrieben 2. März 2005 hey super! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 @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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 2. März 2005 Autor Teilen Geschrieben 2. März 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 @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 ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 3. März 2005 Autor Teilen Geschrieben 3. März 2005 hi, nein ich erkenne dort auch keinen fehler Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 3. März 2005 Teilen Geschrieben 3. März 2005 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* Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 4. März 2005 Teilen Geschrieben 4. März 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 4. März 2005 Teilen Geschrieben 4. März 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 4. März 2005 Teilen Geschrieben 4. März 2005 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........ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SySi2001 Geschrieben 10. März 2005 Autor Teilen Geschrieben 10. März 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Thombo Geschrieben 10. März 2005 Teilen Geschrieben 10. März 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 10. März 2005 Teilen Geschrieben 10. März 2005 Der letzte Code von mir ist keineswegs komplett oder richtig, also benutze ihn nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.