Mit Batch den freien Laufwerkspeicher in GB auslesen

Darkman.X schrieb:
Pwershell ist für Microsoft die Zukunft, die normale Eingabeaufforderung wird immer mehr versteckt. Und Powershell ist auch wesentlich mächtiger, basiert auf .NET.

Zu deiner Gesamtkapazität: Ob es einen einzelnen Befehl gibt, weiß ich nicht, ich bin in Powershell nicht drin. Aber die Idee, den belegten Speicher und freien Speicher zu addieren, ist gut:

((Get-PSDrive -Name Z).Used/1GB) + ((Get-PSDrive -Name Z).Free/1GB)

Funktioniert sogar :)

Funktioniert definitiv in powershell, aber auch in einem batch skript? Habe das mal wie folgt versucht und mit den Klammern rumprobiert, aber es scheint zumindest auf meine weise fehlerhaft zu sein, sodass keine csv erstellt wird oder es wird mir in der csv nur ein "+" ausgespuckt, wo der Gesamte Speicehr sein sollte:
REM Den gesamten Speicher über ein Powershell-Befehl aus freien und genutzten Speicher addieren
FOR /F %%i IN ('powershell (^((Get-PSDrive -Name %Laufwerk%^).Used/1GB) + ^((Get-PSDrive -Name %Laufwerk%^).Free/1GB))') DO SET Gesamter_Speicher_in_GiB=%%i
-------------------------------------------------------------------------------------------------------------------
EDIT:
Habs jetzt alternativ mal in Batch berechnet, bekomme dann aber leider 449 GB statt den tatsächlichen 450 GB heraus:
set /A Gesamter_Speicher_in_GiB=Freier_Speicher_in_GiB+Genutzter_Speicher_in_GiB
echo %Freier_Speicher_in_GiB% + %Genutzter_Speicher_in_GiB% = %Gesamter_Speicher_in_GiB%
Da kommt bestimmt 449,99 GB raus und ich muss irgendwie aufrunden, oder? Oder in batch geht das rechnen mit Kommazahlen garnicht, sodass dort nur auf 449 glatt gekommen werden kann?
Bei letzterem wäre die Addition mit Powershell dann doch besser...

-------------------------------------------------------------------------------------------------------------------
EDIT:
Habe es hinbekommen, habe wohl den obigen powershell befehl falsch eingebunden, habe nun mal geschaut wie das geht, und nun klappt es auf diese Weise:
REM Den gesamten Speicher über ein Powershell-Befehl aus freien und genutzten Speicher addieren
FOR /F %%i IN ('powershell -Executionpolicy Bypass -Command "((Get-PSDrive -Name I).Used/1GB) + ((Get-PSDrive -Name I).Free/1GB)"') DO SET Gesamter_Speicher_in_GiB=%%i

Bin gerne offen für Verbesserungsvorschläge und gerne auch, wie ich obiges beim Einbinden des powershellbefehls in batch korrigieren müsste.

Super vielen Dank, das Lösen der Problemstellung mit eurer Hilfe hat richtig Spaß gemacht und ich habe viel gelernt.
 
Zuletzt bearbeitet:
Dein 1. Versuch (vor den Edits) scheiterte, weil runde Klammern in Batches eine besondere Bedeutung haben. Wenn also eine Batch irgendwelche Klammern nicht für sich selbst verarbeiten soll, dann muss man sie mit dem "^"-Zeichen maskieren.

Der korrekte Befehl wäre also gewesen:
FOR /F %%i IN ('powershell ^(^(Get-PSDrive -Name %Laufwerk%^).Used/1GB^) + ^(^(Get-PSDrive -Name %Laufwerk%^).Free/1GB^)') DO SET Gesamter_Speicher_in_GiB=%%i


Es wundert mich, dass der Befehl aus dem 2. Edit fehlerfrei funktioniert. Ich vermute, dass es wohl an den ""-Zeichen liegt?!

Wie du siehst, man muss in der CMD doch einiges beachten bzw. es funktioniert nicht so einfach ("SET /A" mit Nachkommastellen). Alles Dinge, die in Powershell einfacher sind. Dafür ist die Sprache für mich generell schwieriger zu verstehen. Oder ich werde alt :(
 
biohazard261 schrieb:
Gibt es auch eine so einfachen Befehl um die Gesamtspeicherkapazität auszulesen
Ja, gibt es. Ist sogar nur ein Einzeiler und für das Auslesen auf die Schnelle ganz praktisch.
Den Code gibt man in die PS-Konsole, die man mit Adminrechten starten muss, ein:

PowerShell:
([System.IO.DriveInfo]::GetDrives() | Where {$_.Name -Match 'C'}).TotalSize / (1gb)

Sollte danach die Meldung, dass die notwendigen Berechtigungen für die Ausführungsrichtlinien fehlen, kommen, dann einfach die ExPol entsprechend setzen:

PowerShell:
Set-ExecutionPolicy -Scope "LocalMachine" -ExecutionPolicy "RemoteSigned" -Force

Wenn man wieder auf die Standardrichtlinie zurück möchte:

PowerShell:
Set-ExecutionPolicy -Scope "LocalMachine" -ExecutionPolicy "Restricted" -Force
 
Zurück
Oben