如何将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
相关产品推荐
相关产品推荐

