Zum Inhalt springen

Batch-Datei, die Daten ausliest und in eine csv schreibt


SySi2001

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 

Link zu diesem Kommentar
Auf anderen Seiten teilen


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 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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....

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen


@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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen


@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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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*

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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........

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...