Windows Server 2025 / Exportar el inventario del servidor y los discos a CSV
Los informes de valores separados por comas (CSV) permiten comparar comprobaciones del servidor si mantienen columnas coherentes. Consulte sistema operativo, memoria y discos con PowerShell e incluya el nombre del equipo y el momento de recogida para identificar de dónde procede cada resultado.
Elija los campos y una ubicación de salida protegida
Ejecute este ejemplo localmente en cada servidor con Windows PowerShell 5.1, comprobando que está en el equipo que desea inventariar. Aprenda primero la recogida y escritura de archivos, separadas de la autenticación remota. Mantener los mismos nombres de columna facilitará combinar después informes de varios servidores.
| Archivo | Contenidos |
|---|---|
| server.csv | Nombre del equipo, momento de recogida, sistema operativo, versión, último arranque y memoria |
| disks.csv | Nombre del equipo, momento de recogida, unidad, capacidad, espacio libre y porcentaje libre |
Cada ejecución crea una carpeta nueva con fecha, hora e identificador corto bajo C:\LabReports para separar los resultados anteriores. Los nombres de servidor y la configuración interna pueden ser información operativa sensible; defina quién puede leer la carpeta y durante cuánto tiempo se conservarán sus informes.
Guarde y ejecute el script completo
Cree primero C:\LabScripts y guarde el código completo como C:\LabScripts\Collect-LabInventory.ps1, comprobando que no termine en .ps1.txt. Use un editor con codificación UTF-8; si añade tildes u otros caracteres no ASCII, seleccione UTF-8 con marca de orden de bytes (BOM), según la guía de codificación de Windows PowerShell. Abra Windows PowerShell con Ejecutar como administrador en ese servidor; solo se usan módulos incluidos en Windows PowerShell 5.1. Si una directiva impide ejecutar el archivo, siga los requisitos de ejecución y firma aprobados, sin desactivar protecciones para omitir el bloqueo.
$runLabel = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + ([guid]::NewGuid().ToString('N').Substring(0,6))
$reportDirectory = Join-Path 'C:\LabReports' $runLabel
New-Item -ItemType Directory -Path $reportDirectory -Force -ErrorAction Stop | Out-Null
$os = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop
$computer = Get-CimInstance Win32_ComputerSystem -ErrorAction Stop
$collectedAt = (Get-Date).ToString('o')
[pscustomobject]@{
ComputerName = $env:COMPUTERNAME
CollectedAt = $collectedAt
OS = $os.Caption
Version = $os.Version
LastBoot = $os.LastBootUpTime
MemoryGiB = [math]::Round($computer.TotalPhysicalMemory / 1GB,2)
} | Export-Csv -LiteralPath (Join-Path $reportDirectory 'server.csv') -NoTypeInformation -Encoding UTF8
Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction Stop | ForEach-Object {
[pscustomobject]@{
ComputerName = $env:COMPUTERNAME
CollectedAt = $collectedAt
Drive = $_.DeviceID
SizeGiB = [math]::Round($_.Size / 1GB,2)
FreeGiB = [math]::Round($_.FreeSpace / 1GB,2)
FreePercent = if ($_.Size -gt 0) { [math]::Round(100 * $_.FreeSpace / $_.Size,1) } else { $null }
}
} | Export-Csv -LiteralPath (Join-Path $reportDirectory 'disks.csv') -NoTypeInformation -Encoding UTF8
Write-Output $reportDirectory
Set-Location 'C:\LabScripts'
.\Collect-LabInventory.ps1
El Modelo de información común (CIM, Common Information Model) proporciona las clases de administración consultadas. Los ejemplos de recopilación de información de equipos de Microsoft explican el enfoque. Los cálculos usan la constante binaria 1GB: MemoryGiB, SizeGiB y FreeGiB se expresan en gibibytes, mientras FreePercent expresa un porcentaje. El script no cambia servicios ni configuración del servidor; sí crea la carpeta y los CSV.
Verifique ambos archivos generados
Use la ruta exacta que el script imprime al terminar. Escríbala o péguela sin comillas cuando Read-Host la solicite; la fecha y el identificador cambian en cada ejecución, por lo que no copie una carpeta de ejemplo de otra ejecución:
$reportPath = Read-Host 'Report directory printed by the script'
Import-Csv -LiteralPath (Join-Path $reportPath 'server.csv') | Format-List
Import-Csv -LiteralPath (Join-Path $reportPath 'disks.csv') | Format-Table
Compruebe que server.csv tenga una fila del equipo consultado y que disks.csv incluya sus unidades lógicas locales. Ambos archivos deben contener ComputerName y CollectedAt coherentes, junto con las demás columnas del script. MemoryGiB se calcula a partir de TotalPhysicalMemory de Win32_ComputerSystem, el valor informado por el sistema consultado. En una máquina virtual puede diferir de la configuración prevista por la memoria dinámica y la asignación actual; no representa la memoria física total del host ni garantiza una medida exacta de la memoria instalada.
Trate el CSV como datos
Export-Csv escribe las propiedades de los objetos como columnas. Colocar Format-Table antes de exportar enviaría objetos de formato; mantenga la separación entre objetos, canalizaciones y presentación en PowerShell. El script usa -NoTypeInformation para omitir la cabecera de tipo y -Encoding UTF8, que en Windows PowerShell 5.1 genera UTF-8 con BOM.
Import-Csv devuelve normalmente propiedades de texto, incluso cuando parecen números. Convierta a número un campo antes de comparar capacidades. La configuración regional de la hoja de cálculo puede cambiar separadores decimales o interpretar fechas de otra forma: conserve el CSV original y elija conscientemente delimitador, codificación y tipos al importarlo. El ejemplo siguiente compara porcentajes numéricos válidos:
Import-Csv -LiteralPath (Join-Path $reportPath 'disks.csv') |
Where-Object { [double]$_.FreePercent -lt 20 } |
Select-Object ComputerName,Drive,FreePercent
El 20 % es un ejemplo de filtro, no una política de alertas universal; considere también espacio libre absoluto, crecimiento y carga de trabajo. Si FreePercent está vacío porque Size no es válido o no es mayor que cero, revise esa fila por separado antes de aplicar el filtro: convertir texto vacío a double puede producir 0, y eso no demuestra que el espacio libre real sea del 0 %.
Gestione fallos parciales y conserve los resultados útiles
Si falla la creación de la carpeta o una consulta, revise permisos, espacio libre y disponibilidad de la clase. La ruta impresa al final no demuestra por sí sola que todas las exportaciones hayan funcionado. Compruebe que ambos archivos existan, tengan las columnas esperadas y contengan datos; un único archivo no es un resultado completo.
Repita la recogida sin reiniciar el servidor entre las dos ejecuciones. CollectedAt debe cambiar y LastBoot debe permanecer igual si no hubo reinicio. Para limpiar, identifique exactamente la carpeta creada por la ejecución que desea retirar; no borre todo el árbol LabReports ni otros registros de comprobación.




