La línea de comandos de Windows obtiene espacio en disco en GB


12

Estoy tratando de crear un archivo por lotes para extraer el tamaño total y el espacio libre de la unidad C: \ de servidores (script ejecutado localmente). También necesito que la salida sea fácil de leer, por lo que los bytes no van a funcionar, así que estoy de acuerdo con tener una línea de comando que cree un archivo temporal .vbs.

Parece que lo siguiente podría funcionar, pero el formato / matemática no es correcto.

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%

Los comandos anteriores también solo muestran espacio libre ... También me gustaría el tamaño total ... Me pregunto si el siguiente comando podría ser mejor para extraer la información:

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

Tenga en cuenta también que quiero que esto se pueda copiar / pegar directamente en un símbolo del sistema (no un archivo por lotes - requisitos forzados). Ya he eliminado los "%%" del código anterior.

Nota: debe ejecutarse de forma nativa en Server 2003+ (por lo que Powershell está desactivado, así como cualquier utilidad de terceros).


¿Qué versión de Windows?
EBGreen 01 de

Servidor 2003+, de forma nativa. Actualice mi publicación original para reflejar esto.
BondUniverse 01 de

Respuestas:


10

En virtud de la cláusula de requisitos no obligatorios , el siguiente cmdone-liner podría ayudar:

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

Salida :

==>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

Me doy cuenta de que estás mirando como VBS en este momento, pero PowerShell puede hacer esto muy fácilmente:

$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 primera línea obtiene la información del disco de WMI (solo hace C: en este ejemplo), y selecciona solo los tamaños de Espacio libre y Total.

En las siguientes dos líneas escriba los tamaños de Espacio libre y Total en la consola, formateados para estar en GB, con las fracciones truncadas.

Ejemplo de salida (como está):

223GB total
125GB free

1
Olvidé poner una nota al respecto ... Necesito que funcione de forma nativa en Server 2003+ (dado que Powershell no es nativo en 2003, no puede usarlo). ¡Definitivamente habría sido más fácil con Powershell!
BondUniverse 01 de

3

En un archivo por lotes, puede obtener el tamaño del disco en GB de un disco específico utilizando un script DiskPart. En este ejemplo, estoy configurando el índice de disco específico de acuerdo con el nombre de su modelo (suponiendo que solo haya uno similar en la computadora). Cambie la cadena " Disco SATA " para que coincida con el modelo de su unidad de disco. Puede obtener el nombre del modelo ejecutando el comando " wmic diskdrive get Model, Index " en cmd.

Por supuesto, puede usar una propiedad diferente del disco en el comando wmic: escriba wmic diskdrive get /? para obtener una lista de todas las propiedades de disco que puede usar.

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 solo necesita verificar si la unidad tiene suficiente espacio libre (para instalar o copiar algo, por ejemplo), puede intentar una consulta wmic como esta:

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

esto interrumpirá la ejecución del archivo por lotes si hay menos de 10 Gb libres en C:


2

Divide entre 1024 para obtener kibytes (2 ^ 10). Divide entre 1024 x 1024 para obtener Mibytes (2 ^ 20). Divide entre 1024 x 1024 x 1024 para obtener Gibytes (2 ^ 30).

Windows llama a estas unidades kilobytes, Megabytes y Gigabytes por razones históricas. Creo que mi carcasa es correcta.

Así que cambia tus sumas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.