Thomas Kramer

IT-COW | privates IT-Blog von (C) Thomas Kramer

Vereinfachtes Verwalten des Speicherplatzes

By Administrator at Juni 10, 2017 18:30
Filed Under: Administration

Ich arbeite immer noch daran, die Nachteile des fehlenden RAIDs bei meinem kleinen HP Microserver Gen 8 zu umgehen. Der Server kann im Prinzip natürlich schon RAID, aber ich habe mich aus praktischen Erwägungen dagegen entschieden. Im Privatgebrauch ist ein RAID eher sinnlos, weil man Hochverfügbarkeit da nicht braucht und ein Backup trotzdem zu machen ist.

 

An dem fehlenden RAID stört mich eher dass man immer händisch nachschauen muss, wo ist noch Platz frei, wo kann ich welchen freischaufeln. Daher habe ich jetzt ein Skript dazu geschrieben, um diese Aufgabe für mich etwas zu vereinfachen.

 

Das Skript mountet lokal das Laufwerk mit dem höchsten freien Speicherplatz auf den Buchstaben M, das Laufwerk mit dem geringsten freien Speicherplatz dagegen auf den Buchstaben N. Das Skript kann man z. B. über den Windows Aufgabenplaner in Zeitintervallen automatisch aufrufen lassen, oder gezielt vor einem Downloadstart.

 

Problematisch kann aber werden, wenn der freie Speicherplatz zwischen den Laufwerken sich nur gering unterscheidet und das Laufwerk dann z. B. während eines Kopiervorganges wechselt. Daher sollte man, wenn man Dateien löscht, auch direkt etwas mehr Speicherplatz freischaufeln. Kaputte Dateien sind nicht möglich, aber z. B. Archiv-Fragmente könnten auf mehrere Laufwerke verteilt werden.

 

DOS-typisch sollte man in den SET-Zeilen aufpassen, am Zeilenende keine Leerzeichen zu hinterlassen, weil die sonst in den Inhalt der Variable mit übernommen werden. Oder man arbeitet durchgängig mit Anführungszeichen.

 

@echo off
setlocal EnableDelayedExpansion

REM Skript zum Ermitteln des Laufwerks mit dem größten freien Speicherplatz (M:)
REM und des wenigsten freien Speicherplatz (N:)

REM Netzlaufwerke M: und N: als Erstes wieder entfernen, aber nur wenn vorhanden
set mgefunden=0
set ngefunden=0
for /f "tokens=2,* skip=6" %%e in ('net use') do (
  set ergebnis=%%e
  echo %%e | findstr "M:" >nul
  if errorlevel 1 (
    rem
  ) else (
    set mgefunden=1
  )
  echo %%e | findstr "N:" >nul
  if errorlevel 1 (
    rem
  ) else (
    set ngefunden=1
  )
)

if "!mgefunden!"=="1" (
  net use m: /delete /N
  if ERRORLEVEL 1 (
    echo Dateien noch offen, Skript wird abgebrochen
    goto eof
  )
)
if "!ngefunden!"=="1" (
  net use n: /delete /N
  if ERRORLEVEL 1 (
    echo Dateien noch offen, Skript wird abgebrochen
    goto eof
  )
)

REM Achtung, große Laufwerksbuchstaben verwenden, sonst geht es nicht
set "Ziel1=D:\"
set "Ziel2=E:\"
set "Ziel3=F:\"
set "Ziel4=G:\"

for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace^| findstr "^%Ziel1:~0,2%"') do set drivefreeSpace1=%%S
set drivefreeSpace1=00000000000000000000!drivefreeSpace1!
set drivefreeSpace1=!drivefreeSpace1:~-20!
for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace^| findstr "^%Ziel2:~0,2%"') do set drivefreeSpace2=%%S
set drivefreeSpace2=00000000000000000000!drivefreeSpace2!
set drivefreeSpace2=!drivefreeSpace2:~-20!
for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace^| findstr "^%Ziel3:~0,2%"') do set drivefreeSpace3=%%S
set drivefreeSpace3=00000000000000000000!drivefreeSpace3!
set drivefreeSpace3=!drivefreeSpace3:~-20!
for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace^| findstr "^%Ziel4:~0,2%"') do set drivefreeSpace4=%%S
set drivefreeSpace4=00000000000000000000!drivefreeSpace4!
set drivefreeSpace4=!drivefreeSpace4:~-20!
rem echo %drivefreeSpace1% %drivefreeSpace2% %drivefreeSpace3% %drivefreeSpace4%

REM Bestimmung des Ziellaufwerks mit dem größten freien Speicherplatz
set ZielBiggestSpace=%Ziel1%
set ZielGroesse=!drivefreeSpace1!
if !drivefreeSpace2! gtr !ZielGroesse! (
  set ZielBiggestSpace=%Ziel2%
  set ZielGroesse=!drivefreeSpace2!
)
if !drivefreeSpace3! gtr !ZielGroesse! (
  set ZielBiggestSpace=%Ziel3%
  set ZielGroesse=!drivefreeSpace3!

if !drivefreeSpace4! gtr !ZielGroesse! (
  set ZielBiggestSpace=%Ziel4%
  set ZielGroesse=!drivefreeSpace4!

REM Bestimmung des Ziellaufwerks mit dem geringsten freien Speicherplatz
set ZielLowestSpace=%Ziel1%
set ZielGroesse=!drivefreeSpace1!
if !drivefreeSpace2! lss !ZielGroesse! (
  set ZielLowestSpace=%Ziel2%
  set ZielGroesse=!drivefreeSpace2!
)
if !drivefreeSpace3! lss !ZielGroesse! (
  set ZielLowestSpace=%Ziel3%
  set ZielGroesse=!drivefreeSpace3!

if !drivefreeSpace4! lss !ZielGroesse! (
  set ZielLowestSpace=%Ziel4%
  set ZielGroesse=!drivefreeSpace4!

set ZielBiggestSpaceLfwk=\\localhost\%ZielBiggestSpace:~0,1%$
set ZielLowestSpaceLfwk=\\localhost\%ZielLowestSpace:~0,1%$

if not exist "%Ziel1%" mkdir %Ziel1%
if not exist "%Ziel2%" mkdir %Ziel2%
if not exist "%Ziel3%" mkdir %Ziel3%
if not exist "%Ziel4%" mkdir %Ziel4%

net use M: %ZielBiggestSpaceLfwk% /persistent:yes /user:$Benutzer $Passwort
net use N: %ZielLowestSpaceLfwk% /persistent:yes /user:$Benutzer $Passwort

:eof

   

Monats-Liste