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

PowerShell远程更新检测脚本问题:主机名缺失及输出文件为空

PowerShell远程更新失败检测脚本问题解决

问题1:无法获取远程主机名$item.PSComputerName

  • 核心原因:远程执行的结果对象可能未携带PSComputerName属性,这取决于你获取更新记录的方式(比如部分WMI查询不会自动添加该属性,或者Invoke-Command的上下文丢失)。
  • 可行解决方式:
    1. 手动在远程查询结果中注入主机名:
      如果你用Invoke-Command远程获取更新,直接在脚本块里通过$env:COMPUTERNAME获取本地主机名,再添加到输出对象中:
      $failedUpdates = Invoke-Command -ComputerName $remotePCList -ScriptBlock {
          $localHostName = $env:COMPUTERNAME
          # 这里替换成你获取失败更新的实际命令
          Get-WindowsUpdate -FailedOnly | Select-Object @{Name='ComputerName'; Expression={$localHostName}}, Title, KBArticleID, FailureReason
      }
      
    2. 用CIM查询替代:
      Get-CimInstance在指定-ComputerName时,会自动给结果对象添加PSComputerName属性,直接提取即可:
      $startDate = (Get-Date).AddDays(-7) # 近7天
      $failedUpdates = Get-CimInstance -ComputerName $remotePCList -ClassName Win32_QuickFixEngineering | 
          Where-Object { $_.InstalledOn -ge $startDate -and $_.Status -ne 'Success' } |
          Select-Object PSComputerName, HotFixID, Description, Status
      

问题2:解决主机名后控制台输出正常,但生成的文件为空

  • 常见原因:用Write-Host输出的内容无法被管道捕获写入文件;或者输出对象在传递过程中被意外清空;也可能是权限不足导致写入失败。
  • 对应解决办法:
    1. 替换Write-Host为Write-Output或直接输出内容:
      Write-Host只负责控制台显示,不会进入管道流,所以无法被Out-File/Set-Content捕获。改成直接输出字符串或用Write-Output:
      # 错误写法:Write-Host的内容写不进文件
      $failedUpdates | ForEach-Object { Write-Host "$($_.ComputerName) - $($_.Title) 失败" } | Out-File .\update_report.txt
      
      # 正确写法:直接输出字符串到管道
      $reportContent = $failedUpdates | ForEach-Object {
          "$($_.ComputerName) - 更新标题:$($_.Title) | KB编号:$($_.KBArticleID) | 失败原因:$($_.FailureReason)"
      }
      # 写入文件,指定编码避免乱码
      $reportContent | Out-File -FilePath .\update_report.txt -Encoding UTF8
      
    2. 写入前校验内容是否为空:
      避免因为没有失败记录导致文件为空,可以添加默认内容:
      if ($reportContent) {
          $reportContent | Out-File .\update_report.txt -Encoding UTF8
      } else {
          "近7天未检测到远程主机更新失败记录" | Out-File .\update_report.txt -Encoding UTF8
      }
      
    3. 检查文件写入权限:
      确认脚本运行账户对目标路径有写入权限,比如如果写入C:\Windows\Temp之外的路径,可能需要管理员权限。可以临时改写到桌面测试:
      $reportPath = "$env:USERPROFILE\Desktop\update_report.txt"
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:10:33