270 lines
8.5 KiB
PowerShell
270 lines
8.5 KiB
PowerShell
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()
|