You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Windows健康检查PowerShell脚本的控制台输出写入文件?

解决PowerShell健康检查脚本输出保存到文件的问题

下面提供几种实用的修改方案,帮你把脚本执行的控制台输出保存到日志文件中:

方案1:将输出保存到远程机器的本地日志文件

每个目标计算机的检查日志会单独存在该机器上,方便单台机器排查问题:

# Windows Health Check and Repair Script
$Computers = Import-Csv "C:\Users\NetlonAdmin\Computers.csv"
foreach ($Computer in $Computers){
    Invoke-Command -ComputerName $Computer.Name -ScriptBlock {
        # 定义日志路径,包含机器名和时间戳避免重名
        $logPath = "C:\HealthCheck_$($env:COMPUTERNAME)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
        
        # 执行命令并将标准输出、错误输出都追加到日志
        "=== DISM 修复开始 ===" >> $logPath
        & cmd /c "DISM.exe" /Online /Cleanup-Image /RestoreHealth >> $logPath 2>&1
        
        "`n=== SFC 扫描开始 ===" >> $logPath
        & cmd /c "sfc.exe" /scannow >> $logPath 2>&1
        
        "`n=== CHKDSK 检查开始 ===" >> $logPath
        # CHKDSK默认需重启执行,日志会记录相关提示
        & cmd /c "chkdsk.exe" >> $logPath 2>&1
    }
}

方案2:将所有远程输出收集到本地机器的日志文件

把所有计算机的检查结果统一保存到执行脚本的机器上,便于集中查看:

所有机器日志合并到一个文件

# Windows Health Check and Repair Script
$totalLog = "C:\HealthCheck_All_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
$Computers = Import-Csv "C:\Users\NetlonAdmin\Computers.csv"

foreach ($Computer in $Computers){
    # 写入机器检查的起止标记
    "`n===== 开始检查计算机: $($Computer.Name) ===== $(Get-Date)" | Add-Content -Path $totalLog
    
    # 收集远程执行的所有输出
    $checkOutput = Invoke-Command -ComputerName $Computer.Name -ScriptBlock {
        "=== DISM 修复开始 ==="
        & cmd /c "DISM.exe" /Online /Cleanup-Image /RestoreHealth 2>&1
        
        "`n=== SFC 扫描开始 ==="
        & cmd /c "sfc.exe" /scannow 2>&1
        
        "`n=== CHKDSK 检查开始 ==="
        & cmd /c "chkdsk.exe" 2>&1
    }
    
    # 将收集到的输出写入本地总日志
    $checkOutput | Add-Content -Path $totalLog
    "===== 计算机 $($Computer.Name) 检查结束 ===== $(Get-Date)" | Add-Content -Path $totalLog
}

为每台机器单独生成本地日志文件

# Windows Health Check and Repair Script
$logDir = "C:\HealthCheck_Machine_Logs"
# 自动创建日志目录(如果不存在)
if (-not (Test-Path -Path $logDir)) {
    New-Item -Path $logDir -ItemType Directory | Out-Null
}

$Computers = Import-Csv "C:\Users\NetlonAdmin\Computers.csv"
foreach ($Computer in $Computers){
    $machineLog = Join-Path -Path $logDir -ChildPath "$($Computer.Name)_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
    
    "===== 开始检查计算机: $($Computer.Name) ===== $(Get-Date)" | Add-Content -Path $machineLog
    $checkOutput = Invoke-Command -ComputerName $Computer.Name -ScriptBlock {
        "=== DISM 修复开始 ==="
        & cmd /c "DISM.exe" /Online /Cleanup-Image /RestoreHealth 2>&1
        
        "`n=== SFC 扫描开始 ==="
        & cmd /c "sfc.exe" /scannow 2>&1
        
        "`n=== CHKDSK 检查开始 ==="
        & cmd /c "chkdsk.exe" 2>&1
    }
    $checkOutput | Add-Content -Path $machineLog
    "===== 计算机 $($Computer.Name) 检查结束 ===== $(Get-Date)" | Add-Content -Path $machineLog
}

注意事项

  • 执行脚本的账号必须拥有所有目标计算机的管理员权限,否则远程命令和磁盘操作会失败
  • 2>&1用于将错误输出合并到标准输出,确保错误信息也能写入日志
  • CHKDSK默认需要重启后执行,日志会记录相关提示;如果需要强制修复,可改为chkdsk.exe /f(需权限)

内容的提问来源于stack exchange,提问作者CollusionParadigm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:55:15