Stellen Sie fest, ob auf dem Laufwerk C 2 GB freier Speicherplatz vorhanden sind

7

Ich versuche festzustellen, ob ein Ziel-PC mindestens 2 GB freien Speicherplatz hat. Folgendes habe ich bisher:

@echo off
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set "FreeSpace=%%x"
IF /i %FreeSpace% GTR "2147483648" (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)

Es spielt keine Rolle, ob ich 2 GB einstelle oder auf 200 GB ändere. Es heißt immer, dass ich genug Speicherplatz habe, obwohl dieses Laufwerk nur 90 GB hat ... Bitte helfen Sie, wenn Sie können.

Diese Frage war es, worauf ich meinen obigen Code basierte: Überprüfen Sie den freien Speicherplatz mit Batch-Befehlen

scheint, als sollte es funktionieren, aber es funktioniert nicht.

Sean Beegle
quelle

Antworten:

11

Sie haben 2 Probleme mit Ihrem Code:

1) IF führt nur einen numerischen Vergleich durch, wenn die Zeichenfolge auf beiden Seiten eine Zahl ergibt. Ihre linke Seite ist numerisch, aber Ihre rechte Seite hat Anführungszeichen, wodurch der gesamte Vergleich mithilfe der Zeichenfolgensemantik durchgeführt werden muss. Numerische Ziffern sind immer höher als ein Anführungszeichen, daher wird immer TRUE gemeldet.

Wie Austin in seiner Antwort vorschlägt, ergibt das Entfernen der Anführungszeichen in Ihrem Fall anscheinend die richtige Antwort. Das ist aber nicht die ganze Geschichte! In Wirklichkeit wird geprüft, ob der freie Speicherplatz größer oder gleich 2147483647 ist.

2) Windows-Batch-Nummern (cmd.exe) sind auf eine vorzeichenbehaftete 32-Bit-Genauigkeit beschränkt, was einem Maximalwert von 2 GB -1 Byte (2147483647) entspricht. Die IF-Anweisung weist ein seltsames (möglicherweise unglückliches) Verhalten auf, bei dem jede Zahl größer als 2147483647 als gleich 2147483647 behandelt wird. Sie können Ihre Technik also nicht verwenden, um freien Speicherplatz auf Werte größer als 2147483647 zu testen.

Weitere Informationen finden Sie unter https://stackoverflow.com/q/9116365/1012053 .

In der Antwort des Links wird eine Technik beschrieben, mit der Sie große Zahlen testen können. Sie müssen beide Seiten der Bedingung auf die gleiche Breite belassen und einen Zeichenfolgenvergleich erzwingen.

Im Folgenden wird beispielsweise getestet, ob der freie Speicherplatz> = 4294967296 (4 GB) ist.

@echo off
setlocal
set "pad=000000000000000"
set "NeededSpace=%pad%4294967296"
for /f "delims== tokens=2" %%x in (
  'wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value'
) do for %%y in (%%x) do set "FreeSpace=%pad%%%y"
if "%FreeSpace:~-15%" geq "%NeededSpace:~-15%" echo Drive has at least 4 GB free space.
Dbenham
quelle
Entschuldigung, dieser Code scheint auch nicht zu funktionieren. Es wird immer berichtet, dass 4 GB verfügbar sind, auch wenn Laufwerke mit weniger als 4 GB frei sind.
Sean Beegle
@ SeanBeegle - Hoppla, ich hatte den gleichen Fehler in Bezug auf den nachlaufenden Wagenrücklauf wie Austin. Ich hatte dieses Problem erwartet, mich aber irgendwie mit meinen ursprünglichen Tests getäuscht. Es sollte jetzt behoben sein.
Dbenham
Wenn ich versuche, den Laufwerksbuchstaben von C nach D zu ändern und ihn auszuführen, erhalte ich immer die Meldung "(Echo war zu diesem Zeitpunkt unerwartet".
Muss
@ SeanBeegle - Ja, Sie sollten nur das eine Zeichen ändern müssen. Ich kann mir nicht vorstellen, was dein Problem ist. Ich habe den Code mit 3 verschiedenen Laufwerken (2 lokale, 1 Netzwerk) mit unterschiedlichen benötigten Space-Werten verglichen und immer das richtige Ergebnis erhalten.
Dbenham
@dbenham ... Danke für Ihre Hilfe! ... Ich stellte fest, dass der Fehler meinerseits war, dass die Maschine, an der ich arbeitete, kein D-Laufwerk hatte, das war das Problem! Danke noch einmal!
Sean Beegle
3

Nehmen Sie das "s aus der Anzahl heraus, und das Skript funktioniert fast korrekt. Die Verwendung von "s erzwingt einen Zeichenfolgenvergleich anstelle eines numerischen Vergleichs.

Wie dbenham feststellt, speichert (und vergleicht) CMD Zahlen nur als 32-Bit-Ints mit Vorzeichen. Da wir nach GB suchen, können wir einige weniger wichtige Ziffern vernünftigerweise ignorieren. Wenn wir die letzten 6 Ziffern entfernen, haben wir immer noch eine MB-Auflösung, während wir bis zu 2 Exabyte freien Speicherplatz korrekt erkennen können. Wie bereits erwähnt, müssen wir "Anzahl der entfernten Stellen" + 1 aus dem WMIC-Ergebnis kürzen, da am Ende ein zusätzliches Zeichen steht.

@ECHO off
SETLOCAL EnableDelayedExpansion
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) DO SET "FreeSpaceBig=%%x"
SET FreeSpace=!FreeSpaceBig:~0,-7!
IF %FreeSpace% GTR 2147 (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)
ENDLOCAL

HINWEIS: Sie brauchen das /ihier auch wirklich nicht , da es nur zum Vergleichen von Zeichenfolgen dient und wir einen Ganzzahlvergleich durchführen. Wir könnten auch dir c:\ /-C | find "bytes free"anstelle von verwenden wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value, wenn Sie das Aufrufen von WMI für diesen Vorgang vermeiden möchten (wodurch wir das weglassen EnableDelayedExpansionund %anstelle von !etwa FreeSpaceBigin Zeile 4 verwenden können. Wie auch immer, es handelt sich um Skripte, es gibt normalerweise viele Möglichkeiten, die Aufgabe zu erledigen.

VERBUNDEN:

/programming/293780/free-space-in-a-cmd-shell /programming/9099138/save-values-batch-file/9099542#9099542 https: // stackoverflow.com/questions/7769918/comparing-2-numbers-in-dos-batch-not-working

austinian
quelle
Nicht ganz die ganze Geschichte. Ihre Antwort testet tatsächlich, ob der freie Speicherplatz> = 2147483647 ist. Siehe meine Antwort
dbenham
@dbenham Weißt du, ich habe darüber nachgedacht, aber völlig vergessen, es noch einmal zu überlegen, als ich anfing, meine Antwort zu schreiben, leider. Ich werde meine Antwort mit einem Verlust an Präzisionsberechnung ändern, da Sie eine genaue Berechnung in Ihrer haben.
Austin
Du hast nicht getestet! Sie haben die verzögerte Erweiterung nicht aktiviert, daher schlägt Ihr Teilstring-Vorgang fehl. Wenn Sie die verzögerte Erweiterung aktivieren, wird auch ein unerwartetes Ergebnis angezeigt, da Ihr Wert von WMIC am Ende einen unerwünschten Wagenrücklauf aufweist (ein Artefakt der Konvertierung von Unicode). Sie entfernen also nur die letzten 5 Ziffern, nicht 6. Dies funktioniert, wenn Sie zur normalen Erweiterung wechseln, da dadurch die Wagenrückläufe vor dem Teilstring op automatisch entfernt werden. Schließlich haben Sie vergessen, Ihren Vergleich in der letzten Zeile anzupassen. Sie wollen, wenn> 21474.
Dbenham
Ich habe getestet, ich bin gerade schlampig mit meiner Bearbeitung bezüglich der aktivierten verzögerten Erweiterung geworden, habe aber nicht gründlich auf Werte getestet und das Problem mit dem Wagenrücklauf verpasst>.> Jetzt
behoben
0

Wenn Sie nur überprüfen müssen, ob auf dem Laufwerk genügend freier Speicherplatz vorhanden ist (um beispielsweise etwas zu installieren oder zu kopieren), können Sie die wmic-Abfrage wie folgt versuchen:

wmic LogicalDisk where "DeviceID='c:' and FreeSpace > 10737418240" get DeviceID 2>&1 ^ | find /i "c:" >nul || (echo not enough space&exit 1)

Dadurch wird die Ausführung von Batchdateien unterbrochen, wenn auf C weniger als 10 GB frei sind:

Anilech
quelle
-2

Hier ist eine andere Vorgehensweise ... aber sie ist nicht sehr genau.

Diese Methode verwendet Zeichenfolgenlängenoperationen für die unter "Anzahl der freien Bytes frei" dirund die Laufwerkseigenschaften aufgeführten.

for /f "tokens=3" %%a in ('dir T:\') do (
 set bytesfree=%%a
)
ECHO %bytesfree%>x&FOR %%? IN (x) DO SET /A strlen=%%~z? - 2&del x
IF %strlen% LEQ 13 (

)

Das obige Beispiel bestimmt, ob weniger als 10 GB freier Speicherplatz auf dem T-Laufwerk vorhanden sind.

Ich wollte diese unorthodoxe Vorgehensweise nur für diejenigen teilen, die nicht viel Code mögen.

Aaron Gillion
quelle