web-dev-qa-db-fra.com

La ligne de commande Windows obtient de l'espace disque en Go

J'essaie de créer un fichier de commandes pour extraire la taille totale et l'espace libre du lecteur C:\des serveurs (script exécuté localement). J'ai également besoin que la sortie soit facilement lisible, donc les octets ne fonctionneront pas, alors je peux utiliser une ligne de commande qui crée un fichier .vbs temporaire.

Ce qui suit semble pouvoir fonctionner, mais le formatage/math n'est pas correct.

setlocal
for /f "tokens=6" %a in ('fsutil volume diskfree C: ^| find "of bytes"') do set diskspace=%a
echo wsh.echo FormatNumber(cdbl(%diskspace%)/1024, 0) > %temp%.\tmp.vbs
for /f %a in ('cscript //nologo %temp%.\tmp.vbs') do set diskspace=%a
del %temp%.\tmp.vbs
echo For example %diskspace%

Les commandes ci-dessus ne montrent également que l'espace libre ... J'aimerais aussi la taille totale ... Vous vous demandez si la commande suivante pourrait être meilleure pour extraire les informations:

WMIC LOGICALDISK GET Name,Size,FreeSpace | find /i "C:"

Notez aussi que je veux que ceci puisse être copié/collé directement dans une invite de commande (et non dans un fichier de commandes - exigences imposées). J'ai déjà supprimé les "%%" du code ci-dessus.

Remarque: doit fonctionner en mode natif sur Server 2003+ (donc Powershell est désactivé, ainsi que tout utilitaire tiers).

8
BondUniverse

Sous la clause et non un fichier de commandes - impératifs forcés , la prochaine variable suivante cmd one-liner pourrait aider:

for /f "tokens=1-3" %a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FINDSTR /I /V "Name"') do @echo wsh.echo "%b" ^& " free=" ^& FormatNumber^(cdbl^(%a^)/1024/1024/1024, 2^)^& " GiB"^& " size=" ^& FormatNumber^(cdbl^(%c^)/1024/1024/1024, 2^)^& " GiB" > %temp%\tmp.vbs & @if not "%c"=="" @echo( & @cscript //nologo %temp%\tmp.vbs & del %temp%\tmp.vbs

Sortie :

==>for /f "tokens=1-3" %a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FIND
STR /I /V "Name"') do @echo wsh.echo "%b" ^& " free=" ^& FormatNumber^(cdbl^(%a^
)/1024/1024/1024, 2^)^& " GiB"^& " size=" ^& FormatNumber^(cdbl^(%c^)/1024/1024/
1024, 2^)^& " GiB" > %temp%\tmp.vbs & @if not "%c"=="" @echo( & @cscript //nolog
o %temp%\tmp.vbs & del %temp%\tmp.vbs

C: free=79,11 GiB size=111,45 GiB

D: free=929,47 GiB size=931,51 GiB

==>
8
JosefZ

Je me rends compte que vous cherchez actuellement VBS, mais PowerShell peut le faire très facilement:

$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object Size, FreeSpace

Write-Host ("{0}GB total" -f [math]::truncate($disk.Size / 1GB))
Write-Host ("{0}GB free" -f [math]::truncate($disk.FreeSpace / 1GB))

La première ligne récupère les informations sur le disque auprès de WMI (uniquement C: dans cet exemple) et sélectionne uniquement les tailles Espace libre et Total.

Dans les deux lignes suivantes, écrivez les tailles Espace libre et Total sur la console, au format Go, avec les fractions tronquées.

Exemple de sortie (en l'état):

223GB total
125GB free
6
Ƭᴇcʜιᴇ007

Divisez par 1024 pour obtenir les kibytes (2 ^ 10). Divisez par 1024 x 1024 pour obtenir Mio (2 ^ 20). Divisez par 1024 x 1024 x 1024 pour obtenir des giga-octets (2 ^ 30).

Windows appelle ces unités des kilo-octets, des mégaoctets et des gigaoctets pour des raisons historiques. Je pense que mon boîtier est bon.

Alors changez vos sommes.

1
trigger

Dans un fichier de commandes, vous pouvez obtenir la taille du disque en GB d'un disque spécifié à l'aide d'un script DiskPart. Dans cet exemple, je règle l'index de disque spécifique en fonction de son nom de modèle (en supposant qu'il en existe un seul de ce type sur l'ordinateur). Changez la chaîne " SATA Disk " pour qu'elle corresponde au modèle de votre lecteur de disque. Vous pouvez obtenir le nom du modèle en exécutant la commande " wmic diskdrive get Model, Index " dans cmd.

Bien sûr, vous pouvez utiliser une propriété différente du disque dans la commande wmic - tapez wmic diskdrive get /? pour obtenir la liste de toutes les propriétés du disque peut utiliser.

for /f %%I in ('wmic diskdrive get Model^, Index ^| find "SATA Disk"') do set DISK_Index=%%I

if not exist %~dp0Disk_Size.script (echo list disk > %~dp0Disk_Size.script)
@echo off
FOR /F "tokens=4 delims= " %%J in ('diskpart /s %~dp0Disk_Size.script ^| find "Disk %DISK_Index%"') do set DISK_SIZE=%%J
IF %ERRORLEVEL% EQU 1 (echo No Data was processed, cannot get DISK_SIZE)

echo DISK_SIZE is %DISK_SIZE% GB
1
Eric

Si vous avez juste besoin de vérifier si le lecteur dispose de suffisamment d’espace libre (pour installer ou copier quelque chose par exemple), vous pouvez essayer une requête wmic comme ceci:

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

cela interrompra l'exécution du fichier de commandes s'il y a moins de 10 Go libres sur C:

1
anilech