WinFuture-Forum.de: Dos Batch - Festplattenkapazitäten überprüfen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Dos Batch - Festplattenkapazitäten überprüfen Mail by Error falls Festplatte nicht mehr genug Platz hat


#1 Mitglied ist offline   ReneK 

  • Gruppe: Mitglieder
  • Beiträge: 3
  • Beigetreten: 09. Mai 18
  • Reputation: 0

geschrieben 09. Mai 2018 - 13:18

Hallo.

Ich habe folgende Batch erstellt, um Platzproblemen auf diversen PCs vorzubeugen.
Im Taskplaner läuft der Job täglich (oder öfter), und informiert mit einem Zusatztool per EMail oder ab Win7 per Message Box, ob ein Festplattenlimit erreicht wurde.
Wenn keine Limits überschritten worden sind, wird man nicht mit Informationen vollgemüllt.

Klar ist, man kann das auch über die Windows Ereignisse machen, aber ich wollte eine sehr vereinfachte variable Variante.

Mit meinen begrentzten Mitteln :blink: habe ich also unten stehendes Konstrukt gescribbelt, ...Teile sind aus dem Internet zusammengesucht.
Die Cracks schlagen bestimmt die Hände über den Kopf zusammen. ABER es funktioniert :ph34r:

Vielleicht hat jemand Lust das zu optimieren :rolleyes:

Z.B. kann man wahrscheinlich besser mit Schleifen arbeiten, anstatt mit Knoten im Kopf so viele Sprungmarken zu setzen.
Das ist nämlich auch der Grund, warum ich nicht das ganze Alphabet abfrage :lol:

Statt der Abfrage des Speichers mit "wmic logicaldisk" gibt es noch die "dir LW:\ /-C" Variante. Hier musste ich allerdings feststellen, dass der Speicherplatz unter 10GB nicht richtig verglichen wurde. Das hängt wohl an den unterschiedlichen Formaten der Variablen.

Wer hier dissen will kann das für sein Ego tun.... bringt aber nix :cool:

Alles Gute!


@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

rem 09.05.2018
rem -Getestet unter Win10

rem -----------------------------------------------------------------------------------
rem GERAETENAME
set Server=PC002
rem -----------------------------------------------------------------------------------
rem LAUFWERK-LIMITS ABFRAGEN in MB (Nicht zu pruefende Laufwerke mit AUS kennzeichnen).
rem   HINT: "Dir C:" Befehl unter DOS eingeben und an letzter Zeile (Bytes frei) orientieren.
rem         Eingabe der Variable OHNE Trennzeichen.
set Limit_C=500000
set Limit_D=3000
set Limit_E=AUS
set Limit_F=AUS
rem -----------------------------------------------------------------------------------
rem -----------------------------------------------------------------------------------
rem ERRORLOG
set log=C:\Temp\Festplattenkontolle_%server%.txt
rem -----------------------------------------------------------------------------------
rem MAIL BY ERROR (AN/AUS)
set mailbyerror=AUS
set mailprg="c:\Batch\Blat\Full\blat.exe"
set mailsrv=exchange
set [email protected]
set sender=%Server%[email protected]
set betreff="Fehler bei Festplattenueberpruefung %server%"

rem ODER PER MESSAGE-BOX AUF DEM BILDSCHIRM
set msgbyerror=AN
set angemeldeteruser=ibims
rem -----------------------------------------------------------------------------------


rem INFO:
rem -----------------------------------------------------------------------------------
rem PARAMETER:
rem   LEQ = Weniger als angegebener Wert (limit überschritten)
rem   GTR = Höher als angegebener Wert (limit noch nicht erreicht)
rem -----------------------------------------------------------------------------------
rem Das MailProgramm BLAT muss vorhanden sein fuer den EMailversand.
rem -----------------------------------------------------------------------------------


rem ###################################################################################
rem -----------------------------------------------------------------------------------
rem AB HIER NICHTS MEHR AENDERN
rem -----------------------------------------------------------------------------------
cls
md C:\TEMP 2>nul
echo j| del %log% 2>nul

echo.
echo ----------------------------------------------------
echo.
echo    Pruefen der Festplattenkapazitaet von
echo.
echo    Geraet = %server%
echo.
echo ----------------------------------------------------
echo.


:no0
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
rem !Festplattenplatz:~0,-7! = Kuerzen der angezeigten Bytes um 6 Stellen, also auf MB Ebene
SET Festplattenplatz=!Festplattenplatz:~0,-7!
if %Festplattenplatz% GTR %Limit_C% goto no1
goto fehler_1C


:fehler_1C
echo Laufwerk C:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_C% MegaBytes
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
SET Festplattenplatz=!Festplattenplatz:~0,-7!
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"

echo. >%log%
echo Laufwerk C:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_C% MegaBytes >>%log%
echo "                                             IST  = %Festplattenplatz% MegaBytes Free" >>%log%
echo.
echo.  >>%log%
goto no11



 
:no1
echo Laufwerk C:  =  OK                          - SOLL = %Limit_C% MegaBytes
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"
echo.


:no11
if "%Limit_D%"=="AUS" goto no22
if not exist D:\nul goto fehler_2D
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='D:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
SET Festplattenplatz=!Festplattenplatz:~0,-7!
if %Festplattenplatz% GTR %Limit_D% goto no2
goto fehler_1D


:fehler_1D
echo Laufwerk D:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_D% MegaBytes
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='D:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
SET Festplattenplatz=!Festplattenplatz:~0,-7!
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"

echo Laufwerk D:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_D% MegaBytes >>%log%
echo "                                             IST  = %Festplattenplatz% MegaBytes Free" >>%log%
echo.
echo.  >>%log%
goto no22




:no2
echo Laufwerk D:  =  OK                          - SOLL = %Limit_D% MegaBytes
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"
echo.

:no22
if "%Limit_E%"=="AUS" goto no33
if not exist E:\nul goto fehler_2E
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='E:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
SET Festplattenplatz=!Festplattenplatz:~0,-7!
if %Festplattenplatz% GTR %Limit_E% goto no3
goto fehler_1E


:fehler_1E
echo Laufwerk E:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_E% MegaBytes
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='E:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
SET Festplattenplatz=!Festplattenplatz:~0,-7!
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"

echo Laufwerk E:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_E% MegaBytes >>%log%
echo "                                             IST  = %Festplattenplatz% MegaBytes Free" >>%log%
echo.
echo.  >>%log%
goto no33




:no3
echo Laufwerk E:  =  OK                          - SOLL = %Limit_E% MegaBytes
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"
echo.


:no33
if "%Limit_F%"=="AUS" goto end
if not exist F:\nul goto fehler_2F
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='F:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
SET Festplattenplatz=!Festplattenplatz:~0,-7!
if %Festplattenplatz% GTR %Limit_F% goto no4
goto fehler_1F


:fehler_1F
echo Laufwerk F:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_F% MegaBytes
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='F:'" get FreeSpace /format:value`) DO SET "Festplattenplatz=%%x"
SET Festplattenplatz=!Festplattenplatz:~0,-7!
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"

echo Laufwerk F:  =     ACHTUNG - Limit erreicht - SOLL = %Limit_F% MegaBytes >>%log%
echo "                                             IST  = %Festplattenplatz% MegaBytes Free" >>%log%
echo.
echo.  >>%log%
goto end




:no4
echo Laufwerk F:  =  OK                          - SOLL = %Limit_F% MegaBytes
echo "                                             IST  = %Festplattenplatz% MegaBytes Free"
echo.
goto end




:fehler_2D
echo.
echo Laufwerk D:  =               Laufwerk nicht vorhanden

echo Laufwerk D:  =               Laufwerk nicht vorhanden >>%log%
echo.  >>%log%
goto no22

:fehler_2E
echo.
echo Laufwerk E:  =               Laufwerk nicht vorhanden

echo Laufwerk E:  =               Laufwerk nicht vorhanden >>%log%
echo.  >>%log%
goto no33

:fehler_2F
echo.
echo Laufwerk F:  =               Laufwerk nicht vorhanden

echo Laufwerk F:  =               Laufwerk nicht vorhanden >>%log%
echo.  >>%log%
goto end




:end
echo.
echo.
if exist %log% goto byerror
goto ende




:byerror
FOR /F "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDATE=%%d%%c_%%b_%%a
FOR /F "tokens=1,2,3 delims=:," %%a in ("%time: =0%") do set CTIME=%%a_%%b_%%c
echo. >>%log%
echo. >>%log%
echo Datum: %CDATE%   -   Zeit: %CTIME% >>%log%
echo. >>%log%
echo. >>%log%
echo ES BESTEHEN AUF DEM GERAET >>%log%
echo. >>%log%
echo ---------------------------------------------------------------->>%log%
echo                     %server% >>%log%
echo ---------------------------------------------------------------->>%log%
echo. >>%log%
echo PLATZPROBLEME (siehe oben). >>%log%
echo. >>%log%
echo   **** EINGRIFF ERFORDERLICH ****>>%log%
echo. >>%log%


if "%mailbyerror%"=="AN" goto mailbyerror
if "%msgbyerror%"=="AN" goto msgbyerror
goto ende

:mailbyerror
%mailprg% %log% -server %mailsrv% -to %receiver% -f %sender% -S %betreff%
echo j| del %log% 2>nul
goto ende

:msgbyerror
msg %angemeldeteruser% %server% hat Platzprobleme. Eingriff ist erforderlich. Protokoll unter %log%.
goto ende


:ende




0

Anzeige



#2 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 14.289
  • Beigetreten: 08. April 06
  • Reputation: 884
  • Geschlecht:Männlich
  • Wohnort:Dortmund NRW
  • Interessen:Alles wo irgendwie Strom durchfließt fasziniert mich einfach weswegen ich halt Elektroinstallateur geworden bin :)

geschrieben 09. Mai 2018 - 13:34

Wieso machst du es dir so schwer?

Das lässt sich einfach über die Kontigent-Konfiguration erledigen ohne zig Zeilen Batch-Code ;)

~rechsklick~ auf Parition > Eigenschaften > Kontingent > kontingentverwaltung aktivieren > kontigenteinträge > ~doppelklick~ Warnstufe > NUR DORT! "Speicherplatz beschränken auf" > Lege den Wert bei der Warnstufe fest


das musst du halt dann für die anderen Partitionen wiederholen ;)
Ebenso KANNST! du bei bedarf auch wie du sicherlich sehen wirst festlegen, dass Benutzer XYZ nur ABC-MB/GB/TB belegen darf.

Finde ich zumindest besser als im Zweifelsfall einen Code-Fehler zu suchen ;)
0

#3 Mitglied ist offline   ReneK 

  • Gruppe: Mitglieder
  • Beiträge: 3
  • Beigetreten: 09. Mai 18
  • Reputation: 0

geschrieben 09. Mai 2018 - 14:13

Hi Stefan.

...das ist Hobby :unsure: :blink: :imao:

Um Deine Frage zu beantworten,

-wenn das über die lokale Kontingentverwaltung des "normalen PCs an dem "gearbeitet wird"" abgearbeitet wird, werden die Netzwerkmappings nicht mit geprüft. Die Kontingente gelten ja nur für die "lokalen" Laufwerke.

-Und wenn nicht der DAU schuld ist das der Server voll läuft, sondern so poplige Logfiles, dann bringt mich das auch nicht so richtig weiter.

-Bei NAS Systemen könnte ich mir vorstellen, dass das gar nicht funktioniert. Gibt es da sowas auch?!

-Außerdem möchte ich eine Nachricht, bevor es zum Gau kommt.


Mit der Batch hat man alles in einem Rutsch.


Folgendes kann man zur Problemlösung "Wenig Speicherplatz" zusammenfassen:
- Meine Batch :wink: :wink: :wink:
- Die Kontingentverwaltung
- Diverse Registry Einträge unter HKCU\Software\Microsoft\Windows\CurrentVersion\Policies
- Ereignisprotokolle
- Diverse Tools und sogar Antivierenprogramme

Sicher ist, viele Wege führen nach Rom.
Jetzt sind es schon mindestens fünf :wink:
0

#4 Mitglied ist offline   Stefan_der_held 

  • Gruppe: Offizieller Support
  • Beiträge: 14.289
  • Beigetreten: 08. April 06
  • Reputation: 884
  • Geschlecht:Männlich
  • Wohnort:Dortmund NRW
  • Interessen:Alles wo irgendwie Strom durchfließt fasziniert mich einfach weswegen ich halt Elektroinstallateur geworden bin :)

geschrieben 09. Mai 2018 - 14:17

Beitrag anzeigenZitat (ReneK: 09. Mai 2018 - 14:13)

-wenn das über die lokale Kontingentverwaltung des "normalen PCs an dem "gearbeitet wird"" abgearbeitet wird, werden die Netzwerkmappings nicht mit geprüft. Die Kontingente gelten ja nur für die "lokalen" Laufwerke.


Ja. Serverseitig lässt sich das aber auch so regeln.

Zitat

-Bei NAS Systemen könnte ich mir vorstellen, dass das gar nicht funktioniert. Gibt es da sowas auch?!


Ein NAS sollte sowas ermöglichen ;) aktuell kann ich diesbezüglich von Synology reden... meine sogar auf nen popeligen iOMEGA sowas gesehen zu haben.-

Zitat

-Außerdem möchte ich eine Nachricht, bevor es zum Gau kommt.


desshalb ja die "Warnstufe" und nicht eine pauschale Begrenzung.

Zitat

Sicher ist, viele Wege führen nach Rom.
Jetzt sind es schon mindestens fünf :wink:


so ist es :wink:
0

#5 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.895
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 09. Mai 2018 - 18:31

Ja was erhoffst Du Dir denn jetzt von dem Thread hier? :unsure:

- Du bittest um Hinweise re: Optimierungen
- Du sagst selbst, daß "Experten wohl die Hände überm Kopf zusammenschlagen werden"
- Hinweise, die gegeben werden, wehrst Du ab.


Dabei wirst Du unter Deiner eigenen Prämisse davon ausgehen MÜSSEN, daß Du keine Verbesserungsvorschläge für den Code, sondern eine Vorschläge für eine sinnvolle "Expertenimplementierung" bekommen wirst - NACHDEM besagte Experten besagte Hände zusammengeschlagen haben und mit "das machen wir aber mal ganz anders" kommen.

:huh:

Daher hier nur kurz ein Hinweis auf Weg #n+1 in Richtung Rom:

-- Batch ist für komplexe Geschichten denkbar unbrauchbar.
-- Glücklicherweise gibt es aber Alternativen, beispielsweise in PowerShell (wobei man da wahrscheinlich erst eine aktuelle Version installieren sollte, wenn das nicht mindestens Win8/2012er Maschinen sind).

-- Da gibt es das Modul Storage. Funktionen daraus kann man sich mit
Get-Command -Module Storage
anzeigen und mit -Syntax hintendran bekommt man einen Überblick, welche Funktion welche Parameter zu welchen Zwecken unterstützen.

PS ist dabei objektorientiert. Kleines Beispiel:

# (Get-Volume -DriveLetter D).SizeRemaining / 1gb
192.410572052002


verrät mir, daß auf Laufwerk D noch 192.41GB über sind (Ausgabeformatierung hab ich der Einfachheit weggelassen). Läßt man das -Driveletter weg und sagt
Get-Voluem | foreach-object {$_.SizeRemaining / $_.Size * 100}
bekommt man für jedes verfügbare Volume einen Prozentwert, der beschreibt, wieviel Platz anteilig noch vorhanden ist. Den kann man dann gleich in der Schleife auswerten und zB mit -lt (weniger als) gucken, ob der jeweilige Prozentwert unterhalb eines definierten Limits liegt. Oder man greift .SizeRemaining so, wie es da ist, und prüft das auf Über- oder Unterschreitungen.


WMI ist jetzt nicht der schlechteste Ansatz -- Microsoft setzt inzwischen auf CIM, was man als Nachfolger von WMI begreifen kann --- aber wie Du ja selber gemerkt hast, wird es in Batch sehr schnell sehr umständlich, und wie Stefan bereits anmerkte, geht das Ganze sehr viel kompakter und sehr viel übersichtlicher.

NB - außer PowerShell gibt's noch genug andere Optionen, wie man sowas bauen kann; Microsofts .NET-Umgebung kommt einem da sehr weit entgegen, aber man kann genausgut ein Javascript oder ein VBScript basteln (und WSH verwenden) oder etwas in Perl,Python, PHP oder sonstwas zimmern (muß dann aber natürlich jeweils eine Laufzeit auf dem jeweiligen PC haben). PowerShell hat hier den Vorteil, daß es Remoting unterstützt, insbesondere in einer Domain (die es ja zu geben scheint) sodaß man sein Script auf genau einem PC haben muß, wo es der Taskplaner genau einmal starten muß und von wo aus alle relevanten Maschinen befragt werden können.


Protip: Der Weg via Kontingent ist tatsächlich der beste. Der erfordert aber, daß man Schreiberlinge zuordnet und zuordnen kann, insbesondere auch Dienstkonten in "richtige" Konten ändert. Da hängt einiges dran, bis man hinterher bei "mein Webserver darf X MB Logs schreiben, bis gewarnt wird, aber die anderen Dienste und Anwendungen und Anwender bleiben davon unberührt".

Das würde ich an dieser Stelle nicht so empfehlen wollen, jedenfalls unter der Maßgabe, daß der OP den verfügbaren Kompentenzlevel beschreibt. Soll kein Angriff sein und auch kein "dissen" -- an dieser Stelle muß man wissen, was man tut, und kann in allen anderen Fällen sehr viel falsch machen, was bei festgelegten Quotas ganz schnell zu Gehtnichtmehr führt.

Dieser Beitrag wurde von RalphS bearbeitet: 09. Mai 2018 - 18:33

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#6 Mitglied ist offline   ReneK 

  • Gruppe: Mitglieder
  • Beiträge: 3
  • Beigetreten: 09. Mai 18
  • Reputation: 0

geschrieben 16. Mai 2018 - 09:40

Hallo RalhpS.

Vielen Dank für Infos.
Finde ich toll, Du Dir Zeit genommen hast. ;D

Zitat

Ja was erhoffst Du Dir denn jetzt von dem Thread hier?
- Du bittest um Hinweise re: Optimierungen
- Du sagst selbst, daß "Experten wohl die Hände überm Kopf zusammenschlagen werden"
- Hinweise, die gegeben werden, wehrst Du ab.


Also zum Einen wollte ich mal keine Weltuntergangsstimmung verbreiten, "Hilfe" in dem Sinne brauchte ich ja nicht, sondern eine fertige / funktionierende / simple Lösung vorschlagen. Dass das keine Profilösung ist weiß ich auch. :blink: :blush:
Daher kann man schon sagen, dass die Disskusion eher das Ziel war, als eine Umorganisation für mich und mein :huh: Vorhaben.
Vielleicht hätte sich jemand gefunden... "ja Script ist toll, aber statt der 32kb für die Batch kannst Du das auf 10kb komprimieren mit Schleifen oder sonst was...". Das wäre für MEINEN Weg schön gewesen -> Weil mir die Batchprogrammierung Spaß macht. :imao:

Aber,...

Zitat

Dabei wirst Du unter Deiner eigenen Prämisse davon ausgehen MÜSSEN, daß Du keine Verbesserungsvorschläge für den Code, sondern eine Vorschläge für eine sinnvolle "Expertenimplementierung" bekommen wirst - NACHDEM besagte Experten besagte Hände zusammengeschlagen haben und mit "das machen wir aber mal ganz anders" kommen.

...und das akzeptiere ich und finde es trotzdem wunderbar, dass man auf vernünftige Art und Weise die verschiedenen Wege auch mal dargelegt bekommt. Das wird Anderen die danach googlen vielleicht auch helfen?! :imao: :imao: :imao:
Ich wehre mich ja nicht dagegen. Ich finde die Ansätze super. In vielen Foren ist es aber halt so, das man von Höcksken auf Stöcksken kommt.

Und das war auf keinen Fall mein Ziel. :ph34r:

Danke :smokin:

PS.: Vielleicht bin ich auch einfach nur im falschen Forum. :lol:
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0