# Definindo o caminho e nome do arquivo de log. O arquivo será salvo na Área de Trabalho.
$logPath = "$($env:UserProfile)\Desktop\RelatorioPC.txt"
# Criando o conteúdo inicial do relatório
$report = @"
--------------------------------------------------
Relatório de Informações do Sistema - $env:COMPUTERNAME
--------------------------------------------------
"@
# --- Informações do Sistema e Processador ---
try {
$processor = Get-CimInstance -ClassName Win32_Processor
$report += @"
--- PROCESSADOR ---
Marca: $($processor.Manufacturer)
Modelo: $($processor.Name)
Núcleos: $($processor.NumberOfCores)
Velocidade: $([math]::Round($processor.MaxClockSpeed / 1000,2)) GHz
"@
} catch {
$report += "`n--- PROCESSADOR ---`nNão foi possível obter as informações do processador."
}
# --- Informações de Armazenamento ---
try {
$report += @"
--- ARMAZENAMENTO ---
"@
$disks = Get-PhysicalDisk
$volumes = Get-Volume | Where-Object { $_.DriveLetter -ne $null }
$diskDrives = Get-CimInstance Win32_DiskDrive # pega InterfaceType
foreach ($vol in $volumes) {
# Tenta correlacionar o volume com o disco físico e a interface
$disk = $disks | Select-Object -First 1
$driveInfo = $diskDrives | Select-Object -First 1
$totalSizeGB = [math]::Round($vol.Size / 1GB, 2)
$freeSpaceGB = [math]::Round($vol.SizeRemaining / 1GB, 2)
$usedSpaceGB = $totalSizeGB - $freeSpaceGB
$mediaType = if ($disk.MediaType) { $disk.MediaType } else { "Desconhecido" }
$busType = if ($disk.BusType) { $disk.BusType } else { "Desconhecido" }
$interface = if ($driveInfo.InterfaceType) { $driveInfo.InterfaceType } else { $busType }
switch -Regex ($interface) {
"NVMe" { $tipoFinal = "SSD NVMe" }
"SATA" { if ($mediaType -eq "SSD") { $tipoFinal = "SSD SATA" } else { $tipoFinal = "HDD SATA" } }
"USB" { $tipoFinal = "Disco USB" }
"IDE" { if ($mediaType -eq "SSD") { $tipoFinal = "SSD IDE" } else { $tipoFinal = "HDD IDE" } }
default { $tipoFinal = $mediaType }
}
$report += @"
Nome: $($vol.FileSystemLabel) ($($vol.DriveLetter):)
Modelo: $($disk.FriendlyName)
Tipo de Armazenamento: $tipoFinal
Interface: $interface
Espaço Total: $totalSizeGB GB
Espaço Utilizado: $usedSpaceGB GB
Espaço Livre: $freeSpaceGB GB
"@
}
# Listagem geral dos discos físicos
$report += "`n--- LISTA DE DISCOS FÍSICOS (Get-PhysicalDisk) ---`n"
foreach ($d in $disks) {
$report += "Modelo: $($d.FriendlyName) | Tipo: $($d.MediaType) | BusType: $($d.BusType)`n"
}
} catch {
$report += "`n--- ARMAZENAMENTO ---`nNão foi possível obter as informações de armazenamento."
}
# --- Informações de Memória RAM (Melhorado com a lógica do Código 2) ---
try {
# Extrai informações detalhadas de cada pente de RAM, incluindo o tipo (DDR, DDR4, etc.)
$ramInfo = Get-WmiObject Win32_PhysicalMemory | ForEach-Object {
$ramType = switch ($_.MemoryType) {
20 { "DDR" }
21 { "DDR2" }
24 { "DDR3" }
26 { "DDR4" }
34 { "DDR5" }
default { "Desconhecido ($($_.MemoryType))" }
}
[PSCustomObject]@{
Fabricante = $_.Manufacturer
Modelo = $_.PartNumber.Trim()
Tipo = $ramType
"Tamanho (GB)" = [math]::Round($_.Capacity / 1GB, 2)
"Frequência (MHz)" = $_.Speed
"Frequência Atual (MHz)" = $_.ConfiguredClockSpeed
Slot = $_.DeviceLocator
}
}
$totalMemoryGB = [math]::Round((Get-CimInstance -ClassName Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 2)
$report += @"
--- MEMÓRIA RAM ---
Memória Total Instalada: $totalMemoryGB GB
Slots de Memória Ocupados: $($ramInfo.Count)
"@
# Adicionando os detalhes de cada pente de RAM no formato de tabela solicitado
$report += "`nDetalhes da Memória RAM (Pentes):`n"
# Captura a tabela formatada, usando Out-String com largura alta para garantir que a tabela não quebre linhas.
$ramTable = $ramInfo | Format-Table -AutoSize | Out-String -Width 150
$report += $ramTable
} catch {
$report += "`n--- MEMÓRIA RAM ---`nNão foi possível obter as informações de memória RAM."
}
# --- Informações de Rede ---
try {
# Filtra apenas adaptadores de rede que estão ativos e possuem IP
$nic = Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled -eq $true }
$report += @"
--- INFORMAÇÕES DE REDE ---
IP: $($nic.IPAddress -join ', ')
MAC: $($nic.MacAddress -join ', ')
"@
} catch {
$report += "`n--- INFORMAÇÕES DE REDE ---`nNão foi possível obter as informações de rede."
}
# --- Periféricos USB/Wireless ---
try {
# Busca por mouses e teclados wireless (pode incluir dispositivos USB também)
$usbDevices = Get-PnpDevice -Class "Mouse" | Where-Object { $_.FriendlyName -like "*wireless*" }
$usbDevices += Get-PnpDevice -Class "Keyboard" | Where-Object { $_.FriendlyName -like "*wireless*" }
# Adiciona outros dispositivos USB genéricos, excluindo classes como HID (Human Interface Devices)
$usbDevices += Get-PnpDevice | Where-Object { $_.FriendlyName -like "*usb*" -and ($_.Class -notlike "*HID*") }
# Remove duplicatas
$usbDevices = $usbDevices | Select-Object -Unique -ExpandProperty FriendlyName
$report += @"
--- DISPOSITIVOS CONECTADOS (USB/Wireless) ---
"@
if ($usbDevices.Count -gt 0) {
foreach ($deviceName in $usbDevices) {
$report += "Nome do dispositivo: $deviceName`n"
}
} else {
$report += "Nenhum dispositivo USB wireless ou acoplado foi encontrado."
}
} catch {
$report += "`n--- DISPOSITIVOS CONECTADOS (USB/Wireless) ---`nNão foi possível obter as informações dos dispositivos."
}
# --- Fim do Relatório ---
$report += "
--------------------------------------------------
Relatório gerado em: $((Get-Date).ToString('dd/MM/yyyy'))
--------------------------------------------------"
# Salvando o relatório no arquivo principal
# O parâmetro -Force garante que o arquivo seja sobrescrito se já existir
$report | Out-File -FilePath $logPath -Encoding UTF8 -Force
# Mensagem de confirmação
Write-Host "Relatório salvo com sucesso em: $logPath"