在这里插入图片描述



这篇文章是我参加 「星图计划年度征文(第1期)—Claude Code 开发者创客大赛:AI 编程实战征文计划」 的实战投稿。我不会空谈“AI 编程多厉害”,而是用一个我日常桌面支持真实会用到的小项目——一键排障包(Triage Pack),把我从需求、Prompt、迭代、验收到交付的全过程讲清楚,大家可以直接照着抄。


请添加图片描述

1、我为什么选择这个题:Claude Code 让我从“写代码”变成“验收代码”

以前我做桌面支持脚本开发,最大的时间消耗不在“核心逻辑”,而在这些反复出现的边角料:

  • 参数怎么设计更顺手
  • 日志怎么写才方便复盘
  • 异常怎么处理才不崩
  • 输出目录怎么统一
  • README 怎么写才让同事一看就会用

我发现 Claude Code 最猛的地方,是它能把这些“工程化边角料”一次性补齐。
所以我现在的工作方式变成了: 我负责把需求说清楚、验收标准写清楚;Claude Code 负责把工程化交付补齐。


请添加图片描述

2、项目背景:我做的“一键排障包”到底解决什么问题?

在企业桌面支持里,我最怕的不是“问题难”,而是“信息不够”。

用户一句“电脑卡”“Outlook 弹窗”“VPN 连不上”,如果我拿不到关键证据链,就会陷入反复追问:

  • 系统版本?补丁?启动项?
  • 事件日志哪一段?
  • 网络 DNS / 代理 / 路由是什么?
  • 是否有组策略、证书、驱动冲突?

于是我给自己定了一个非常明确的目标: 把“来回问 10 次”变成“发我一个 zip 我就能开工”。

✅ 一键排障包要采集什么?

我把输出固定成一个标准目录结构:

  • 系统信息:OS 版本、补丁、启动项
  • 网络信息:ipconfig、路由、代理、DNS 缓存
  • 事件日志:System / Application 最近 N 小时导出
  • 交付:自动打包 zip + 生成 summary.txt 摘要
  • 可靠性:单步失败不退出,记录 run.log 继续跑

请添加图片描述

3、我怎么写 Prompt:我不用“请帮我写脚本”,我用“验收清单”

我现在给 Claude Code 下指令,核心就一句话:先写验收标准,再让它写代码
因为 AI 最怕“模糊”,我最怕“不可交付”。

下面这段是我常用的 Prompt 模板(我直接第一人称写法,你可以原封不动抄):

你是企业桌面支持自动化专家。
我需要一个 PowerShell 的“一键排障包”脚本,要求如下:

1) 参数:
   -Hours (默认24):采集最近N小时事件日志
   -OutDir (默认C:\Temp\Triage):输出目录
   -Zip(开关):是否打包zip
2) 输出目录结构必须是:
   OutDir\
     summary.txt
     sys\systeminfo.txt
     sys\hotfix.txt
     sys\startup.txt
     net\ipconfig.txt
     net\route.txt
     net\proxy.txt
     net\dns_cache.txt
     logs\System.evtx
     logs\Application.evtx
     run.log
3) 可靠性:
   - 所有关键步骤写入 run.log
   - 单步失败不退出:记录错误并继续
4) 安全边界:
   - 不上传任何数据到外网
   - 不修改系统配置
5) 交付:
   - 先给我设计思路和目录结构
   - 再给完整脚本
   - 再给 README(如何运行/输出说明/常见问题)

请先输出MVP版本(最小可用),再建议增强项。

我会额外强调一句: “只做最小改动,不要随意重构目录结构。”
这样我后续迭代不会被它“越改越花”。


请添加图片描述

4、核心代码:我最终交付给同事的 PowerShell 版本(可直接运行)

✅ 说明:这是我“最小可用版”(MVP)。你发布时可以配一个 GitHub 仓库(加分项),但即使只贴文章里也能复现。

<#
.SYNOPSIS
  Triage Pack - 一键排障包(系统/网络/事件日志采集 + 可选Zip打包)
.EXAMPLE
  .\triage.ps1 -Hours 24 -OutDir C:\Temp\Triage -Zip
#>

param(
  [int]$Hours = 24,
  [string]$OutDir = "C:\Temp\Triage",
  [switch]$Zip
)

$ErrorActionPreference = "Continue"
$start = Get-Date

function Ensure-Dir([string]$p) {
  if (-not (Test-Path $p)) { New-Item -ItemType Directory -Path $p -Force | Out-Null }
}
function Log([string]$msg) {
  $line = "[{0}] {1}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $msg
  $line | Out-File -FilePath $global:RunLogPath -Append -Encoding UTF8
}
function Try-Run([string]$title, [scriptblock]$action) {
  try { Log "START: $title"; & $action; Log "DONE : $title" }
  catch { Log "ERROR: $title -> $($_.Exception.Message)" }
}

Ensure-Dir $OutDir
$sysDir  = Join-Path $OutDir "sys"
$netDir  = Join-Path $OutDir "net"
$logDir  = Join-Path $OutDir "logs"
Ensure-Dir $sysDir; Ensure-Dir $netDir; Ensure-Dir $logDir

$global:RunLogPath = Join-Path $OutDir "run.log"
"--- Triage Pack Run Log ---" | Out-File $global:RunLogPath -Encoding UTF8

$summaryPath = Join-Path $OutDir "summary.txt"
Try-Run "Write summary header" {
  $os = Get-CimInstance Win32_OperatingSystem
  $cs = Get-CimInstance Win32_ComputerSystem
  @(
    "Triage Pack Summary"
    "==================="
    "ComputerName: $env:COMPUTERNAME"
    "User        : $env:USERNAME"
    "OS          : $($os.Caption) $($os.Version)"
    "BootTime    : $([Management.ManagementDateTimeConverter]::ToDateTime($os.LastBootUpTime))"
    "Model       : $($cs.Manufacturer) $($cs.Model)"
    "Hours       : $Hours"
    "OutDir      : $OutDir"
    "StartTime   : $start"
  ) | Out-File $summaryPath -Encoding UTF8
}

Try-Run "Collect systeminfo" {
  systeminfo | Out-File (Join-Path $sysDir "systeminfo.txt") -Encoding UTF8
}
Try-Run "Collect hotfix" {
  Get-HotFix | Sort-Object InstalledOn -Descending | Out-String |
    Out-File (Join-Path $sysDir "hotfix.txt") -Encoding UTF8
}
Try-Run "Collect startup items" {
  Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, Location, User |
    Format-Table -Auto | Out-String |
    Out-File (Join-Path $sysDir "startup.txt") -Encoding UTF8
}

Try-Run "Collect IP config" {
  ipconfig /all | Out-File (Join-Path $netDir "ipconfig.txt") -Encoding UTF8
}
Try-Run "Collect routes" {
  route print | Out-File (Join-Path $netDir "route.txt") -Encoding UTF8
}
Try-Run "Collect proxy" {
  netsh winhttp show proxy | Out-File (Join-Path $netDir "proxy.txt") -Encoding UTF8
}
Try-Run "Collect DNS cache" {
  ipconfig /displaydns | Out-File (Join-Path $netDir "dns_cache.txt") -Encoding UTF8
}

Try-Run "Export event logs (System/Application)" {
  $ms = [int64]$Hours * 60 * 60 * 1000
  $systemEvtx = Join-Path $logDir "System.evtx"
  $appEvtx    = Join-Path $logDir "Application.evtx"
  wevtutil epl System $systemEvtx /q:"*[System[TimeCreated[timediff(@SystemTime) <= $ms]]]"
  wevtutil epl Application $appEvtx /q:"*[System[TimeCreated[timediff(@SystemTime) <= $ms]]]"
}

$end = Get-Date
$cost = [int]($end - $start).TotalSeconds
Try-Run "Append summary footer" {
  @("", "EndTime   : $end", "Cost(s)   : $cost") | Out-File $summaryPath -Append -Encoding UTF8
}

if ($Zip) {
  Try-Run "Zip output" {
    $zipPath = "$OutDir.zip"
    if (Test-Path $zipPath) { Remove-Item $zipPath -Force }
    Compress-Archive -Path (Join-Path $OutDir "*") -DestinationPath $zipPath -Force
    Log "ZIP: $zipPath"
  }
}

Write-Host "✅ Done. Output: $OutDir"
if ($Zip) { Write-Host "✅ Zip   : $OutDir.zip" }
Write-Host "⏱ Cost  : $cost s"

请添加图片描述

5、我如何对比效率:传统方式 vs Claude Code(我的计时口径)

为了写得更“实战”,我自己做了一个简单计时:
从“开始做需求”到“同事可直接拿去跑”的时间。

阶段 我自己传统写(分钟) 我用 Claude Code(分钟) 我的体感
把需求拆成验收清单 20 10 Claude 会提醒边界条件
生成脚本骨架 40 8 参数/目录/日志一次到位
补异常/日志/README 60 12 这部分提效最明显
自测&修 bug 40 20 仍需要我把关
合计 160 50 约 3 倍提效

我的结论非常明确: 提效不是因为 AI 会写代码,而是它把“工程化交付”补齐得更快。


请添加图片描述

6、我怎么迭代修 bug:我把“事实”喂给 Claude Code,让它做“最小改动”

我修 AI 代码时,只做一件事:把日志/报错/复现条件贴给它,并要求“最小改动”。

6.1 最常用的修复指令

下面是 run.log 报错片段(原样粘贴):
xxx
请只做最小改动修复,不要改目录结构,并说明原因。

6.2 我会让它补“自检项”,减少后续反复沟通

请增加 -Diagnose 开关:检测管理员权限、输出目录权限、wevtutil 可用性;
把检测结果写到 summary.txt,并且失败时脚本不要直接退出。

请添加图片描述

7、我用 Mermaid 画出自己的 Claude Code 工作流(我每次都按这个走)

我遇到痛点/需求

我写验收清单

Claude Code 生成MVP

我本地自测

是否达标?

我粘贴错误/日志/复现条件
要求最小改动修复

我补README/FAQ/截图

我打包交付/发仓库/发布文章


请添加图片描述

8、我踩过的坑(写出来更像“实战文章”,也更容易拿高分)

  • 坑 1:能跑 ≠ 可交付
    我一开始拿到代码就满足了,结果同事用时各种问。后来我把交付物写死:run.log / summary.txt / README / 目录结构,效果立竿见影。

  • 坑 2:AI 容易“过度重构”
    我只想修一个小 bug,它可能顺手把结构全改了。我的解决办法就是固定一句: “只做最小改动,不要重构目录结构。”

  • 坑 3:权限不足导致日志导出失败
    我要求“失败继续跑”,至少把系统/网络信息采集出来,这样也能支持第一轮定位。


❓FAQ(我自己最常被问的 6 个问题)

Q1:我没有编程基础,Claude Code 也能用吗?
A:能。我建议你从“写验收清单”开始,你不需要会写所有代码,但你要会判断结果对不对。

Q2:我怎么让它输出更符合我想要的结构?
A:把“目录结构”“文件名”“必须产出什么”写死,这是最有效的约束。

Q3:Claude Code 会取代程序员吗?
A:我认为短期不会。它会吃掉重复劳动,但“定义正确/判断风险/验收交付”依然是人最核心的价值。

Q4:脚本安全怎么保证?
A:我会在 Prompt 里明确“不上传、不改系统配置”,并且我会人工过一遍脚本里是否有敏感命令。

Q5:怎么提高这类征文的评分?
A:我会做到三点:主题紧扣、结构清晰、可复现。最好再配一个仓库链接和运行截图。

Q6:这个脚本还能怎么增强?
A:我计划后面加:驱动版本采集、性能计数器采样、关键注册表导出、WMI 快照,以及自带“脱敏打包”。


请添加图片描述

9、结语:我眼里的“AI 编程效率”到底是什么?

对我来说,Claude Code 不是“替我写代码”,而是让我把时间花在更值钱的地方: 我把“写代码”变成“定义正确 + 快速验收 + 快速交付”。

如果你也是做开发、做运维、做桌面支持的,我非常建议你试试这种工作流:先写验收清单,再让 AI 产出,再用日志和复现条件做迭代。你会发现效率提升真的不是一点点。


请添加图片描述

⬆️ 返回顶部

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐