Wie kann ich in einer .bat-Datei den verfügbaren Speicherplatz testen?

7

Ich habe ein .bat-Skript, das mit dem Einschalten eines dedizierten Sicherungsservers beginnt, die produktive Umgebung mit Robocopy speichert und den Server herunterfährt, wenn Sie fertig sind.

Vor dem Speichern werden einige Überprüfungen durchgeführt und geeignete Maßnahmen angefordert, wenn etwas nicht in Ordnung ist, z. B. wenn der Ziel-JBOD-Fall aufgrund des Ausschaltens nicht erkannt wurde.

Es gibt jedoch noch eine Einschränkung, die ich bisher nicht bewältigen konnte.

Wie kann ich in der .bat-Datei testen, ob auf den Zielfestplatten genügend Speicherplatz vorhanden ist, um alle Dateien zu empfangen, oder nicht? (Es ist in Ordnung, auf eine feste Speichergröße zu testen, die regelmäßig geändert wird. Derzeit sind es fast 100 GB.)

Ist es überhaupt möglich? Wenn ja, welchen Befehl muss ich recherchieren?

Kraut
quelle

Antworten:

12

Ich schlage vor, dafür ein PowerShell-Skript zu verwenden.

wmicGibt die Größe in Byte zurück. Der Stapel ist auf Zahlenvergleiche von vorzeichenbehafteten 32-Bit-Ganzzahlen beschränkt, die weit unter 100 GB liegen. Sie müssten zuerst die Zahl abschneiden.

Power Shell

if ((Get-WMIObject Win32_Logicaldisk -filter "deviceid='C:'").FreeSpace -gt 100GB){
  "yes enough free space"
} else {
  "not enough free space"
}

Ich muss die obigen Informationen zum Nummernvergleich im Batch erweitern .
Wenn Zahlen in Zeichenfolgen gleicher Länge enthalten sind, können sie als Zeichenfolgen gültig verglichen werden.
Ein Zeichenfolgenvergleich erfolgt zeichenweise, ein führendes Leerzeichen / Null ist kleiner als 1.

Derzeit beträgt die größte Festplattengröße 10 TB = 10995116277760 Byte mit 14 Dezimalstellen. Der folgende Stapel verwendet 15 Stellen für alle Zahlen.

@Echo off
Rem        543210987654321
Set "Blank=               "
Set "GB100=   107374182400"
Set "TB_10= 10995116277760"

for /f "tokens=2" %%A in (
  'wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "C:"'
) Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"

Echo FreeSpace="%FreeSpace%"
Echo    100 GB="%GB100%"

If "%FreeSpace%" gtr "%GB100%" (
  Echo yes enough free space
) else (
  Echo not enough free space
)

Beispielausgabe:

> Check-FreeSpace.cmd
FreeSpace="   101606346752"
   100 GB="   107374182400"
not enough free space

> Check-FreeSpace.cmd
FreeSpace="  1181504520192"
   100 GB="   107374182400"
yes enough free space
LotPings
quelle
1
@ Bob Zeug und Unsinn, 15 Dezimalstellen halten ~ 909,5 TB ziemlich nahe an der derzeit nicht verfügbaren 1PB - aber das Konzept ist klar und niemand hält Sie davon ab, 16 Stellen zu verwenden, um ~ 8,88PB zu erhalten
LotPings
1
Hm. Es hat nicht ganz in meinem Kopf geklickt, dass Sie den 10-TB-Wert um eine Ziffer überschritten haben, sorry.
Bob
9

Am einfachsten ist es, die letzte Zeile in der dirAusgabe zu betrachten

dir /-c /w C: | find "bytes free"

Sie können auch die Größe Wert direkt erhalten , indem die 3 bekommen rd Token in der Ausgabe

FOR /F "tokens=3 USEBACKQ" %%F IN (`dir /-c /w C:`) DO set "size=%%F"
echo %size%

Es ist jedoch nicht zuverlässig, da die Zeichenfolge in einer anderen Sprache möglicherweise anders ist. Beachten Sie auch, dass Sie manchmal viel freien Speicherplatz haben, aber keine weiteren Dateien schreiben können, weil Sie einige Grenzen wie die maximale Dateigröße oder die maximale Anzahl von Dateien in einem Volume / Verzeichnis erreicht haben ...

Der richtigste Weg ist

wmic LogicalDisk where DeviceID='C:' Get FreeSpace /value
phuclv
quelle
Ich vermute, dass das find /i "C:"Teil nicht das tun würde, was Sie erwarten, wenn Sie mehrere Partitionen auf Pfaden haben, die mit beginnen C:. Windows hat dies seit 2000 erlaubt, aber es ist keine sehr häufig verwendete Funktion, so dass dies im Fall des OP möglicherweise kein Problem darstellt, aber es ist wahrscheinlich nicht "der richtigste Weg", dies zu tun.
Ein Lebenslauf
@ MichaelKjörling wenn das Laufwerk eingebaut ist path\to\mountpointdann dir /-c /w path\to\mountpoint | find "bytes free"funktioniert es noch. Möglicherweise benötigen Sie ein unterstützendes Skript mit, mountvolwenn Sie möchten, dass es funktioniertwmic
phuclv