m.fessler
Goto Top

Belegter sowie freier Speicherplatz ermitteln und vergleichen

Hallo zusammen,

ich möchte mittels einer Batch den belegten Speicherplatz auf Laufwerk A sowie den freien Speicherplatz auf Laufwerk B ermitteln
um dann festzustellen ob die Daten von A auf B Platz hätten.

Habe das einmal mit Bordmitteln und einmal mit Hilfe von psinfo gebastelt aber so wirklich gefällt mir das noch nicht.
Mit den fehlenden Kommastellen kann ich leben.
Aber lässt sich zum Beispiel das Kürzen oder Rechnen mit in das setzen der Variabeln mit einbeziehen sodass ich nicht dafür noch mal extra welche setzen muss?
Oder hat jemand einen ganz anderen Ansatz?

Danke und Grüße
Martin

@echo off & setlocal
cls

for /f "tokens=5 delims= " %%a in ('fsutil volume diskfree d: ^| find "Gesamtanz."') do set Z_Free=%%a  

for /f "tokens=4 delims= " %%a in ('fsutil volume diskfree c: ^| find "Gesamtanzahl Bytes"') do set Q_Total=%%a  
for /f "tokens=6 delims= " %%a in ('fsutil volume diskfree c: ^| find "Gesamtanzahl an freien Bytes"') do set Q_Free=%%a  

set /a Q_Total1=%Q_Total:~0,-4%/1024*1000/1024/1024
set /a Q_Free1=%Q_Free:~0,-4%/1024*1000/1024/1024
set /a Z_Free1=%Z_Free:~0,-4%/1024*1000/1024/1024

set /a Q_Used=%Q_Total1%-%Q_Free1%

echo Speicherplatz benötigt:  %Q_Used% GB
echo Speicherplatz verfügbar: %Z_Free1% GB
echo.

if %Q_Used% GEQ %Z_Free1% goto zuklein
goto ok

:zuklein
echo Ziel ist zu klein!
goto :EOF

:ok
echo Hat Platz!

@echo off & setlocal
cls

for /f "tokens=7" %%i in ('C:\programme\psinfo.exe -d volume 2^>nul ^|findstr /c:"D:"')do set "Z_Free=%%i"  

for /f "tokens=5-7" %%i in ('C:\programme\psinfo.exe -d volume 2^>nul ^|findstr /c:"C:"')do (  
  set "Q_Total=%%i"  
  set "Q_Free=%%k"  
)

set /a Z_Free1=%Z_Free:~0,-3%
set /a Q_Total1=%Q_Total:~0,-3%
set /a Q_Free1=%Q_Free:~0,-3%

set /a Q_Used=%Q_Total1%-%Q_Free1%

echo Speicherplatz benötigt:  %Q_Used% GB
echo Speicherplatz verfügbar: %Z_Free1% GB
echo.

if %Q_Used% GEQ %Z_Free1% goto zuklein
goto ok

:zuklein
echo Ziel ist zu klein!
goto :EOF

:ok
echo Hat Platz!

Content-ID: 283380

Url: https://administrator.de/contentid/283380

Ausgedruckt am: 23.11.2024 um 08:11 Uhr

114757
Lösung 114757 19.09.2015, aktualisiert am 18.10.2015 um 12:20:42 Uhr
Goto Top
@echo off
for /f "delims=" %%a in ('powershell -ExecutionPolicy ByPass -Command "&{$a = (gwmi Win32_LogicalDisk -Filter \"DeviceId ^= 'A:'\"); $b = (gwmi Win32_LogicalDisk -Filter \"DeviceId ^= 'B:'\"); $b.FreeSpace -gt ($a.Size - $a.FreeSpace)}"') DO @(if /i "%%a" == "True" echo Freier Speicherplatz auf B ist ausreichend )  

Gruß jodel32
m.fessler
m.fessler 20.09.2015 um 00:57:05 Uhr
Goto Top
Hallo jodel32,

wooow das ist mal "kompakt". face-smile

Habe A: zu C: und B: zu D: geändert - bekomme aber keine Antwort - getestet mit XP und Win7.
Mache ich was falsch?

Danke und Grüße
114757
114757 20.09.2015 aktualisiert um 10:23:13 Uhr
Goto Top
Kleiner Typo, sorry... ist oben korrigiert.

p.s. unter XP muss die Powershell nachinstalliert werden, Powershell ist ab Vista per Default installiert.
m.fessler
m.fessler 21.09.2015 um 06:56:46 Uhr
Goto Top
Hammer vielen Dank!

Zur Info für XP User: Es braucht Version 2.0 von Powershell. Mit Version 1.0 wollte es nicht funktionieren.

Für Lernzwecke: Lässt sich die Variabel schon beim ersten setzen (oben... Zeile 6) kürzen bzw. umrechnen oder geht das nicht ohne dass man es eben später (oben... Zeile 9) macht?

Danke und Grüße
m.fessler
m.fessler 24.09.2015 um 16:41:55 Uhr
Goto Top
Hey Jodel,

eine bitte noch:
Könntest du mir bitte noch zwei Zeilen so schreiben dass jeweils der belegte Speicherplatz von A: und der freie von B: als variable gesetzt wird welche ich später zB. mittels echo ausgeben kann?

Vielen Dank!
Grüße
114757
114757 24.09.2015 aktualisiert um 17:24:08 Uhr
Goto Top
for /f "tokens=1,2 delims= " %%a in ('powershell.exe -ExecutionPolicy ByPass -Command "&{$a = (gwmi Win32_LogicalDisk -Filter \"DeviceId ^= 'A:'\"); $b = (gwmi Win32_LogicalDisk -Filter \"DeviceId ^= 'B:'\");$belegt=$a.Size - $a.FreeSpace;$free=$b.Freespace;\"$belegt $free\"}"') DO @(  
 echo Belegter Speicher von A %%a
 echo Freier Speicher von B %%b
)
oder das ganze nicht in Bytes sondern MB:
for /f "tokens=1,2 delims= " %%a in ('powershell.exe -ExecutionPolicy ByPass -Command "&{$a = (gwmi Win32_LogicalDisk -Filter \"DeviceId ^= 'A:'\"); $b = (gwmi Win32_LogicalDisk -Filter \"DeviceId ^= 'B:'\");$belegt=\"{0:F2}\" -f (($a.Size - $a.FreeSpace)/1MB);$free=\"{0:F2}\" -f ($b.Freespace / 1MB);\"$belegt $free\"}"') DO @(  
 echo Belegter Speicher von A %%aMB
 echo Freier Speicher von B %%bMB
)
m.fessler
m.fessler 24.09.2015 um 23:44:23 Uhr
Goto Top
Vielen Dank!

Hätte ich wohl lieber gleich fragen sollen:
Lässt sich das gut kombinieren (Prüfung + Info über die Größen) oder soll ich es einfach nacheinander (und somit 2x) abfragen?

Grüße
114757
114757 25.09.2015 aktualisiert um 13:08:47 Uhr
Goto Top
Zitat von @m.fessler:
Lässt sich das gut kombinieren (Prüfung + Info über die Größen) oder soll ich es einfach nacheinander (und somit 2x) abfragen?
Ja, lass ich dir aber mal als Knobelaufgabe, sollst davon ja was lernen und nicht nur kopieren face-smile

Den Beitrag dann bitte noch auf gelöst setzen. Danke.
m.fessler
m.fessler 28.09.2015 um 04:22:30 Uhr
Goto Top
Ja, lass ich dir aber mal als Knobelaufgabe, sollst davon ja was lernen und nicht nur kopieren face-smile

Das hatte ich bereits - leider vergeblich.
Werde also wohl die Befehle nacheinander ablaufen lassen und somit eben zweimal hintereinander die Größen abfragen.

Hätte da noch eine Lernfrage zu meinem cmd Batch mit fsutil Beispiel:
Lässt sich die Variabel schon beim ersten setzen (Zeile 6) kürzen bzw. umrechnen oder geht das nicht ohne dass man es eben später (Zeile 9) macht?

Danke und Grüße
114757
114757 28.09.2015 um 09:30:58 Uhr
Goto Top
setlocal enabledelayedexpansion
for /f "tokens=4 delims= " %%a in ('fsutil volume diskfree c: ^| find "Gesamtanzahl Bytes"') do (  
    set Q_Total=%%a
    set /a Q_Total=!Q_Total:~0,-4!/1024*1000/1024/1024
)
echo !Q_Total!
Sei aber gewarnt die Batch kann hier nur mit Zahlen bis 2^31 rechnen !!! Also 2,147,483,647 (2GB)
m.fessler
m.fessler 13.10.2015 aktualisiert um 07:27:39 Uhr
Goto Top
Vielen Dank jodel32!

Gleich mit dem ersten setzen der Variabel kürzen und rechnen geht nicht - oder?

do set /a Q_Total=%%a:~0,-4/1024*1000/1024/1024 
... oder so face-wink

Zitat von @114757:
Sei aber gewarnt die Batch kann hier nur mit Zahlen bis 2^31 rechnen !!! Also 2,147,483,647 (2GB)
Da die Zahl aber vor dem Rechenvorgang um 3 Stellen gekürzt wird ist somit das Limit praktisch 1,95TB - oder hab ich da nen Denkfehler?

Grüße
114757
114757 13.10.2015 um 09:29:11 Uhr
Goto Top
Zitat von @m.fessler:
Gleich mit dem ersten setzen der Variabel kürzen und rechnen geht nicht - oder?
Nein.
Zitat von @114757:
Sei aber gewarnt die Batch kann hier nur mit Zahlen bis 2^31 rechnen !!! Also 2,147,483,647 (2GB)
Da die Zahl aber vor dem Rechenvorgang um 3 Stellen gekürzt wird ist somit das Limit praktisch 1,95TB - oder hab ich da nen Denkfehler?
Probiers aus face-wink
m.fessler
m.fessler 18.10.2015 um 12:20:06 Uhr
Goto Top
Zitat von @114757:
Sei aber gewarnt die Batch kann hier nur mit Zahlen bis 2^31 rechnen !!! Also 2,147,483,647 (2GB)
Da die Zahl aber vor dem Rechenvorgang um 3 Stellen gekürzt wird ist somit das Limit praktisch 1,95TB - oder hab ich da nen Denkfehler?
Probiers aus face-wink
Müsst ich glatt noch erst ne Platte kaufen gehen. face-smile

Ich stell dann mal auf "gelöst".
Danke für deine Hilfe!