Windows Server 2025 / Mengekspor inventaris server dan disk ke CSV
Laporan CSV (comma-separated values, nilai yang dipisahkan koma) memudahkan perbandingan pemeriksaan server jika susunan kolomnya konsisten. Gunakan PowerShell untuk mengambil informasi sistem operasi, memori, dan disk, lalu sertakan nama komputer serta waktu pengumpulan agar asal setiap hasil dapat diketahui.
Pilih bidang dan lokasi output yang dilindungi
Jalankan contoh ini secara lokal dengan Windows PowerShell 5.1 pada server yang ingin Anda inventarisasi. Pelajari pengumpulan data dan penulisan file terlebih dahulu, terpisah dari autentikasi jarak jauh. Nama kolom yang sama akan memudahkan penggabungan laporan dari beberapa server.
| File | Konten |
|---|---|
| server.csv | Nama komputer, waktu pengumpulan, sistem operasi, versi, waktu mulai terakhir, dan memori |
| disks.csv | Nama komputer, waktu pengumpulan, drive, kapasitas, ruang kosong, dan persentase ruang kosong |
Setiap eksekusi membuat folder baru di bawah C:\LabReports dengan stempel waktu dan pengenal singkat agar hasil sebelumnya tetap terpisah. Nama server dan konfigurasi internal dapat menjadi informasi operasional sensitif; tentukan siapa yang boleh membaca folder serta berapa lama laporan disimpan.
Simpan dan jalankan skrip lengkap
Buat C:\LabScripts terlebih dahulu, lalu simpan seluruh kode sebagai C:\LabScripts\Collect-LabInventory.ps1. Pastikan namanya tidak berakhiran .ps1.txt. Gunakan UTF-8; jika menambahkan aksara non-ASCII, pilih UTF-8 dengan penanda urutan byte (BOM, byte order mark), sesuai panduan pengodean karakter Windows PowerShell. Buka Windows PowerShell pada server tersebut dengan Run as administrator. Contoh hanya menggunakan modul bawaan Windows PowerShell 5.1. Jika kebijakan memblokir file, penuhi persyaratan eksekusi dan tanda tangan yang disetujui organisasi tanpa menonaktifkan perlindungan untuk melewati pemblokiran.
$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
CIM (Common Information Model) adalah model informasi bersama yang menyediakan kelas manajemen yang digunakan di sini. Contoh pengumpulan informasi komputer dari Microsoft menjelaskan pendekatannya. Konstanta biner 1GB berarti 1.073.741.824 byte: MemoryGiB, SizeGiB, dan FreeGiB menggunakan satuan gibibyte, sedangkan FreePercent menyatakan persentase. Skrip tidak mengubah layanan atau konfigurasi server, tetapi membuat folder keluaran dan file CSV.
Verifikasi kedua file yang dihasilkan
Gunakan jalur folder yang benar-benar dicetak pada akhir eksekusi Anda. Ketik atau tempel jalur itu tanpa tanda kutip saat Read-Host memintanya. Stempel waktu dan pengenal berubah setiap eksekusi, sehingga jangan menyalin folder contoh dari hasil lain:
$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
Pastikan server.csv memiliki satu baris untuk komputer yang diperiksa, sementara disks.csv memuat drive logis lokalnya. ComputerName dan CollectedAt harus sesuai pada kedua file; periksa juga kolom lainnya. MemoryGiB dihitung dari TotalPhysicalMemory pada Win32_ComputerSystem, yaitu nilai yang dilaporkan sistem yang diperiksa. Pada mesin virtual, memori dinamis dan alokasi saat ini dapat menjelaskan perbedaannya dari konfigurasi VM yang direncanakan. Nilai ini bukan total memori fisik host dan tidak menjamin pengukuran tepat terhadap seluruh modul memori yang terpasang.
Tangani CSV sebagai data
Export-Csv menulis properti objek sebagai kolom. Menempatkan Format-Table sebelum ekspor justru meneruskan objek pemformatan; pisahkan objek, pipeline, dan tampilan PowerShell. -NoTypeInformation menghilangkan baris informasi tipe, sedangkan -Encoding UTF8 menghasilkan UTF-8 dengan BOM pada Windows PowerShell 5.1.
Import-Csv biasanya mengembalikan properti berupa teks, meskipun nilainya terlihat seperti angka. Ubah nilai menjadi angka sebelum melakukan perbandingan numerik. Pengaturan wilayah aplikasi spreadsheet dapat mengubah pemisah desimal atau penafsiran tanggal. Simpan CSV asli dan pilih pemisah, pengodean, serta tipe data dengan cermat saat mengimpor. Filter berikut mengasumsikan persentase numerik yang valid:
Import-Csv -LiteralPath (Join-Path $reportPath 'disks.csv') |
Where-Object { [double]$_.FreePercent -lt 20 } |
Select-Object ComputerName,Drive,FreePercent
Ambang 20% adalah contoh filter, bukan kebijakan peringatan universal. Pertimbangkan pula ruang kosong absolut, pertumbuhan, dan kebutuhan beban kerja. Jika FreePercent kosong karena Size tidak valid atau tidak lebih besar dari nol, periksa baris tersebut secara terpisah sebelum memfilter. Konversi teks kosong ke double dapat menghasilkan 0; hasil itu tidak membuktikan bahwa persentase ruang kosong sebenarnya adalah 0%.
Tangani kegagalan parsial dan simpan hasil yang berguna
Jika pembuatan folder atau kueri gagal, periksa izin, ruang kosong, dan ketersediaan kelas. Jalur yang dicetak pada akhir skrip tidak membuktikan bahwa seluruh ekspor berhasil. Pastikan kedua file ada, memiliki kolom yang diharapkan, dan berisi data; satu file saja belum merupakan hasil lengkap.
Ulangi pengumpulan tanpa memulai ulang server di antara kedua eksekusi. CollectedAt harus berubah, sedangkan LastBoot tetap sama jika tidak terjadi mulai ulang. Saat membersihkan hasil, identifikasi tepat folder yang dibuat oleh eksekusi tersebut. Jangan menghapus seluruh pohon folder LabReports atau catatan pemeriksaan lainnya.




