Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $script:results = @() function Log-Message { param([string]$message) $txtLog.AppendText("$message`r`n") $txtLog.ScrollToCaret() } function Add-Result { param( [string]$name, [string]$status, [string]$current, [string]$required, [bool]$passed ) $script:results += [PSCustomObject]@{ Name = $name Status = $status Current = $current Required = $required Passed = $passed } Update-ResultsTable } function Update-ResultsTable { $dgvResults.Rows.Clear() foreach ($r in $script:results) { $row = $dgvResults.Rows.Add($r.Name, $r.Status, $r.Current, $r.Required) if ($r.Status -like "*通过*" -or $r.Status -like "*OK*") { $dgvResults.Rows[$row].DefaultCellStyle.ForeColor = [System.Drawing.Color]::Green } elseif ($r.Status -like "*失败*" -or $r.Status -like "*FAIL*") { $dgvResults.Rows[$row].DefaultCellStyle.ForeColor = [System.Drawing.Color]::Red } else { $dgvResults.Rows[$row].DefaultCellStyle.ForeColor = [System.Drawing.Color]::Orange } } } function Check-OS { Log-Message "`n[1/5] 检查操作系统..." $os = Get-CimInstance Win32_OperatingSystem $osName = $os.Caption $is64bit = [Environment]::Is64BitOperatingSystem $status = "[OK] 通过" $passed = $true if (-not $osName -like "*Windows 11*") { $status = "[FAIL] 失败" $passed = $false } if (-not $is64bit) { $status = "[FAIL] 失败" $passed = $false } $arch = if ($is64bit) { "64位" } else { "32位" } $current = "$osName ($arch)" Add-Result "操作系统" $status $current "Windows 11 64位" $passed Log-Message " 系统: $current" Log-Message " 结果: $status" } function Check-Memory { Log-Message "`n[2/5] 检查内存..." $os = Get-CimInstance Win32_OperatingSystem $totalMemoryGB = [math]::Round($os.TotalVisibleMemorySize / 1MB, 2) $status = "[OK] 通过" $passed = $true if ($totalMemoryGB -lt 8) { $status = "[FAIL] 失败" $passed = $false } Add-Result "内存" $status "$totalMemoryGB GB" ">= 8 GB" $passed Log-Message " 总内存: $totalMemoryGB GB" Log-Message " 结果: $status" } function Check-Disk { Log-Message "`n[3/5] 检查磁盘空间..." $drive = Get-PSDrive C $freeGB = [math]::Round($drive.Free / 1GB, 2) $status = "[OK] 通过" $passed = $true if ($freeGB -lt 10) { $status = "[FAIL] 失败" $passed = $false } Add-Result "磁盘空间" $status "$freeGB GB 可用" ">= 10 GB" $passed Log-Message " 可用空间: $freeGB GB" Log-Message " 结果: $status" } function Check-Network { Log-Message "`n[4/5] 检查网络连接..." try { $response = Invoke-WebRequest -Uri "https://www.baidu.com" -TimeoutSec 5 -UseBasicParsing $status = "[OK] 通过" $passed = $true $current = "已连接" } catch { $status = "[FAIL] 失败" $passed = $false $current = "无法连接" } Add-Result "网络连接" $status $current "能正常上网" $passed Log-Message " 网络: $current" Log-Message " 结果: $status" } function Check-Admin { Log-Message "`n[5/5] 检查管理员权限..." $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $status = "[OK] 通过" $passed = $true $current = "是" if (-not $isAdmin) { $status = "[WARN] 建议" $passed = $false $current = "否" } Add-Result "管理员权限" $status $current "建议以管理员身份运行" $passed Log-Message " 管理员: $current" Log-Message " 结果: $status" } function Start-Checks { $btnCheck.Enabled = $false $progressBar.Visible = $true $progressBar.Style = [System.Windows.Forms.ProgressBarStyle]::Marquee $script:results = @() Update-ResultsTable $lblSummary.Text = "" Log-Message "`n$('=' * 60)" Log-Message "开始系统检查..." Log-Message "$('=' * 60)" Check-OS Check-Memory Check-Disk Check-Network Check-Admin $progressBar.Visible = $false $btnCheck.Enabled = $true $passedCount = ($script:results | Where-Object { $_.Passed }).Count $totalCount = $script:results.Count Log-Message "`n$('=' * 60)" Log-Message "检查完成: $passedCount/$totalCount 项通过" Log-Message "$('=' * 60)" if ($passedCount -eq $totalCount) { $lblSummary.Text = "所有检查通过!您的系统符合 OpenClaw 安装要求。" $lblSummary.ForeColor = [System.Drawing.Color]::Green } else { $lblSummary.Text = "$($totalCount - $passedCount) 项检查未通过,请查看检查结果。" $lblSummary.ForeColor = [System.Drawing.Color]::Orange } } $form = New-Object System.Windows.Forms.Form $form.Text = "OpenClaw 前置条件检查工具" $form.Size = New-Object System.Drawing.Size(900, 700) $form.StartPosition = "CenterScreen" $form.Font = New-Object System.Drawing.Font("Microsoft YaHei UI", 9) $lblTitle = New-Object System.Windows.Forms.Label $lblTitle.Text = "OpenClaw 前置条件检查" $lblTitle.Font = New-Object System.Drawing.Font("Microsoft YaHei UI", 16, [System.Drawing.FontStyle]::Bold) $lblTitle.Location = New-Object System.Drawing.Point(20, 20) $lblTitle.Size = New-Object System.Drawing.Size(500, 30) $form.Controls.Add($lblTitle) $btnPanel = New-Object System.Windows.Forms.Panel $btnPanel.Location = New-Object System.Drawing.Point(20, 60) $btnPanel.Size = New-Object System.Drawing.Size(840, 40) $form.Controls.Add($btnPanel) $btnCheck = New-Object System.Windows.Forms.Button $btnCheck.Text = "开始检查" $btnCheck.Location = New-Object System.Drawing.Point(0, 5) $btnCheck.Size = New-Object System.Drawing.Size(120, 30) $btnCheck.Add_Click({ Start-Checks }) $btnPanel.Controls.Add($btnCheck) $btnExit = New-Object System.Windows.Forms.Button $btnExit.Text = "退出" $btnExit.Location = New-Object System.Drawing.Point(760, 5) $btnExit.Size = New-Object System.Drawing.Size(80, 30) $btnExit.Add_Click({ $form.Close() }) $btnPanel.Controls.Add($btnExit) $progressBar = New-Object System.Windows.Forms.ProgressBar $progressBar.Location = New-Object System.Drawing.Point(20, 110) $progressBar.Size = New-Object System.Drawing.Size(840, 20) $progressBar.Visible = $false $form.Controls.Add($progressBar) $tabControl = New-Object System.Windows.Forms.TabControl $tabControl.Location = New-Object System.Drawing.Point(20, 140) $tabControl.Size = New-Object System.Drawing.Size(840, 430) $form.Controls.Add($tabControl) $tabResults = New-Object System.Windows.Forms.TabPage $tabResults.Text = "检查结果" $tabControl.Controls.Add($tabResults) $dgvResults = New-Object System.Windows.Forms.DataGridView $dgvResults.Location = New-Object System.Drawing.Point(10, 10) $dgvResults.Size = New-Object System.Drawing.Size(800, 380) $dgvResults.AllowUserToAddRows = $false $dgvResults.ReadOnly = $true $dgvResults.SelectionMode = "FullRowSelect" $dgvResults.AutoSizeColumnsMode = "Fill" [void]$dgvResults.Columns.Add("Name", "检查项") [void]$dgvResults.Columns.Add("Status", "状态") [void]$dgvResults.Columns.Add("Current", "当前值") [void]$dgvResults.Columns.Add("Required", "要求") $tabResults.Controls.Add($dgvResults) $tabLog = New-Object System.Windows.Forms.TabPage $tabLog.Text = "详细日志" $tabControl.Controls.Add($tabLog) $txtLog = New-Object System.Windows.Forms.TextBox $txtLog.Location = New-Object System.Drawing.Point(10, 10) $txtLog.Size = New-Object System.Drawing.Size(800, 380) $txtLog.Multiline = $true $txtLog.ScrollBars = "Vertical" $txtLog.ReadOnly = $true $txtLog.Font = New-Object System.Drawing.Font("Consolas", 9) $tabLog.Controls.Add($txtLog) $lblSummary = New-Object System.Windows.Forms.Label $lblSummary.Text = "" $lblSummary.Location = New-Object System.Drawing.Point(20, 580) $lblSummary.Size = New-Object System.Drawing.Size(840, 30) $lblSummary.Font = New-Object System.Drawing.Font("Microsoft YaHei UI", 11) $form.Controls.Add($lblSummary) Log-Message "欢迎使用 OpenClaw 前置条件检查工具!" Log-Message "点击「开始检查」按钮开始检查您的系统。" [void]$form.ShowDialog()