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-Key: 283380

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

Printed on: April 19, 2024 at 21:04 o'clock

Mitglied: 114757
Solution 114757 Sep 19, 2015, updated at Oct 18, 2015 at 10:20:42 (UTC)
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
Member: m.fessler
m.fessler Sep 19, 2015 at 22:57:05 (UTC)
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
Mitglied: 114757
114757 Sep 20, 2015 updated at 08:23:13 (UTC)
Goto Top
Kleiner Typo, sorry... ist oben korrigiert.

p.s. unter XP muss die Powershell nachinstalliert werden, Powershell ist ab Vista per Default installiert.
Member: m.fessler
m.fessler Sep 21, 2015 at 04:56:46 (UTC)
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
Member: m.fessler
m.fessler Sep 24, 2015 at 14:41:55 (UTC)
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
Mitglied: 114757
114757 Sep 24, 2015 updated at 15:24:08 (UTC)
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
)
Member: m.fessler
m.fessler Sep 24, 2015 at 21:44:23 (UTC)
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
Mitglied: 114757
114757 Sep 25, 2015 updated at 11:08:47 (UTC)
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.
Member: m.fessler
m.fessler Sep 28, 2015 at 02:22:30 (UTC)
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
Mitglied: 114757
114757 Sep 28, 2015 at 07:30:58 (UTC)
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)
Member: m.fessler
m.fessler Oct 13, 2015 updated at 05:27:39 (UTC)
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
Mitglied: 114757
114757 Oct 13, 2015 at 07:29:11 (UTC)
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
Member: m.fessler
m.fessler Oct 18, 2015 at 10:20:06 (UTC)
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!