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


12

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, donc je suis d'accord avec une ligne de commande qui crée un fichier temp .vbs.

Ce qui suit semble fonctionner, mais le formatage / mathématiques 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 de l'espace libre ... Je voudrais également 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 également que je veux que cela puisse être copié / collé directement dans une invite de commande (pas un fichier de commandes - exigences forcées). J'ai déjà supprimé les "%%" du code ci-dessus.

Remarque: doit s'exécuter en mode natif sur Server 2003+ (donc Powershell est sorti, ainsi que tous les utilitaires tiers).


quelle version de windows?
EBGreen

Server 2003+, natif. Mettez à jour mon message d'origine pour refléter cela.
BondUniverse

Réponses:


10

Dans le cadre de la clause pas un fichier de commandes - exigences obligatoires , la prochaine cmdligne peut 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

==>

11

Je me rends compte que vous regardez comme VBS en ce moment, 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 obtient les informations sur le disque à partir de WMI (fait juste C: dans cet exemple), et ne sélectionne que l'espace libre et les tailles totales.

Dans les deux lignes suivantes, écrivez les tailles d'espace libre et total sur la console, formatées pour être en Go, avec des fractions tronquées.

Exemple de sortie (en l'état):

223GB total
125GB free

1
J'ai oublié de mettre une note à ce sujet ... J'en ai besoin pour fonctionner nativement sur Server 2003+ (puisque Powershell n'est pas natif en 2003, je ne peux pas l'utiliser). Cela aurait certainement été plus facile avec Powershell!
BondUniverse

3

Dans un fichier de commandes, vous pouvez obtenir la taille du disque en Go d'un disque spécifié en utilisant un script DiskPart. Dans cet exemple, je configure l'index de disque spécifique en fonction de son nom de modèle (en supposant qu'il n'y en a qu'un comme celui-ci sur l'ordinateur). Modifiez la chaîne « Disque SATA » pour correspondre 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 une liste de toutes les propriétés de disque que vous pouvez 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

3

Si vous avez juste besoin de vérifier si le disque a suffisamment d'espace libre (pour installer ou copier quelque chose par exemple), vous pouvez essayer la 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 batch s'il reste moins de 10 Go sur C:


2

Divisez par 1024 pour obtenir des kibytes (2 ^ 10). Divisez par 1024 x 1024 pour obtenir Mioctets (2 ^ 20). Divisez par 1024 x 1024 x 1024 pour obtenir des Gibytes (2 ^ 30).

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

Alors changez vos sommes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.