From ad51a92595a9e66f6ae3d6b9ab00c4e8f002aff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=85=8E=E9=A5=BC=E6=9E=9C=E5=AD=90=E5=8D=B7=E9=B2=A8?= =?UTF-8?q?=E9=B1=BC=E8=BE=A3=E6=A4=92?= Date: Tue, 1 Jul 2025 18:11:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BACursor=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E7=9A=84=E7=8E=AF=E5=A2=83=E6=A3=80=E6=9F=A5=E5=92=8C=E6=9C=BA?= =?UTF-8?q?=E5=99=A8=E7=A0=81=E4=BF=AE=E6=94=B9=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=B9Cursor=E7=8E=AF=E5=A2=83=E7=9A=84?= =?UTF-8?q?=E5=85=A8=E9=9D=A2=E6=A3=80=E6=9F=A5=EF=BC=8C=E5=8C=85=E6=8B=AC?= =?UTF-8?q?Python=E7=8E=AF=E5=A2=83=E3=80=81=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=81=E7=9B=AE=E5=BD=95=E7=BB=93=E6=9E=84=E5=92=8C?= =?UTF-8?q?=E6=9D=83=E9=99=90=E9=AA=8C=E8=AF=81=E3=80=82=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BA=86=E6=9C=BA=E5=99=A8=E7=A0=81=E9=85=8D=E7=BD=AE=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=B5=81=E7=A8=8B=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E5=A4=87=E4=BB=BD=E5=92=8C=E9=AA=8C=E8=AF=81=E6=AD=A5=E9=AA=A4?= =?UTF-8?q?=EF=BC=8C=E7=A1=AE=E4=BF=9D=E7=94=A8=E6=88=B7=E5=9C=A8=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E8=BF=87=E7=A8=8B=E4=B8=AD=E8=8E=B7=E5=BE=97=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E7=9A=84=E5=8F=8D=E9=A6=88=E5=92=8C=E5=BB=BA=E8=AE=AE?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E4=BA=86=E7=94=A8=E6=88=B7=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E7=9A=84=E5=8F=AF=E9=9D=A0=E6=80=A7=E5=92=8C=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CURSOR_SCRIPT_OPTIMIZATION_SUMMARY.md | 89 ++++++++ scripts/run/cursor_mac_id_modifier.sh | 277 ++++++++++++++++++++++-- scripts/run/cursor_win_id_modifier.ps1 | 281 +++++++++++++++++++++++-- 3 files changed, 607 insertions(+), 40 deletions(-) create mode 100644 CURSOR_SCRIPT_OPTIMIZATION_SUMMARY.md diff --git a/CURSOR_SCRIPT_OPTIMIZATION_SUMMARY.md b/CURSOR_SCRIPT_OPTIMIZATION_SUMMARY.md new file mode 100644 index 0000000..4d141eb --- /dev/null +++ b/CURSOR_SCRIPT_OPTIMIZATION_SUMMARY.md @@ -0,0 +1,89 @@ +# Cursor 脚本优化完成总结 + +## 概述 +已成功完成 Cursor 脚本的优化工作,实现了用户选择菜单功能和全面的错误处理增强。 + +## 主要改进 + +### 1. 用户选择菜单功能 ✅ +- **选项 1:仅修改机器码** + - 仅执行机器码修改功能 + - 跳过文件夹删除/环境重置步骤 + - 保留现有 Cursor 配置和数据 + +- **选项 2:重置环境+修改机器码** + - 执行完全环境重置(删除 Cursor 文件夹) + - 包含警告信息:"配置将丢失,请注意备份" + - 按照机器代码修改 + - 相当于原有的完整脚本行为 + +### 2. 错误处理增强 ✅ + +#### Windows PowerShell 版本增强: +- ✅ 添加 `Test-CursorEnvironment` 函数进行环境检查 +- ✅ 增强的配置文件存在性和格式验证 +- ✅ 详细的错误提示和解决方案 +- ✅ 备份操作的成功验证 +- ✅ 操作进度指示器(1/5 到 5/5) +- ✅ 修改结果验证和自动回滚机制 +- ✅ `Start-CursorToGenerateConfig` 辅助功能 + +#### macOS Shell 版本增强: +- ✅ 添加 `test_cursor_environment` 函数 +- ✅ Python3 环境检查(macOS 版本必需) +- ✅ 配置文件格式验证 +- ✅ 目录权限检查 +- ✅ 操作进度指示器 +- ✅ 修改结果验证和自动恢复 +- ✅ `start_cursor_to_generate_config` 辅助功能 + +### 3. 用户体验改进 ✅ +- ✅ 清晰的中文界面和提示信息 +- ✅ 操作前的二次确认机制 +- ✅ 详细的操作流程说明 +- ✅ 友好的成功/失败反馈 +- ✅ 具体的问题解决建议 + +### 4. 兼容性检查 ✅ +- ✅ Cursor 安装路径验证 +- ✅ Python3 环境检查(macOS) +- ✅ 配置文件目录结构检查 +- ✅ 权限验证 + +## 修改的文件 +1. `scripts/run/cursor_win_id_modifier.ps1` - Windows PowerShell 版本 +2. `scripts/run/cursor_mac_id_modifier.sh` - macOS Shell 版本 + +## 新增功能函数 + +### Windows PowerShell: +- `Test-CursorEnvironment` - 环境检查 +- `Start-CursorToGenerateConfig` - 启动 Cursor 生成配置 +- 增强的 `Modify-MachineCodeConfig` - 带进度和验证 + +### macOS Shell: +- `test_cursor_environment` - 环境检查 +- `start_cursor_to_generate_config` - 启动 Cursor 生成配置 +- 增强的 `modify_machine_code_config` - 带进度和验证 + +## 使用方式 +1. 运行脚本后会显示选择菜单 +2. 用户输入 1 或 2 选择执行模式 +3. 选择选项 2 时会有额外的确认步骤 +4. 脚本会自动进行环境检查 +5. 根据选择执行相应的功能流程 +6. 提供详细的操作反馈和错误处理 + +## 测试状态 +- ✅ PowerShell 脚本语法验证通过 +- ✅ 函数结构完整性检查通过 +- ✅ 错误处理逻辑验证通过 + +## 安全特性 +- ✅ 自动备份原始配置 +- ✅ 备份完整性验证 +- ✅ 修改失败时自动恢复 +- ✅ 操作前环境检查 +- ✅ 详细的操作日志 + +这次优化大大提升了脚本的可靠性、用户体验和错误处理能力,使其更适合在各种环境下安全使用。 diff --git a/scripts/run/cursor_mac_id_modifier.sh b/scripts/run/cursor_mac_id_modifier.sh index 6b9ef07..10eeee8 100644 --- a/scripts/run/cursor_mac_id_modifier.sh +++ b/scripts/run/cursor_mac_id_modifier.sh @@ -316,18 +316,161 @@ restart_cursor_and_wait() { return 0 } -# 🛠️ 修改机器码配置 +# 🔍 检查Cursor环境 +test_cursor_environment() { + local mode=${1:-"FULL"} + + echo + log_info "🔍 [环境检查] 正在检查Cursor环境..." + + local config_path="$HOME/Library/Application Support/Cursor/User/globalStorage/storage.json" + local cursor_app_data="$HOME/Library/Application Support/Cursor" + local cursor_app_path="/Applications/Cursor.app" + local issues=() + + # 检查Python3环境(macOS版本需要) + if ! command -v python3 >/dev/null 2>&1; then + issues+=("Python3环境不可用,macOS版本需要Python3来处理JSON配置文件") + log_warn "⚠️ [警告] 未找到Python3,请安装Python3: brew install python3" + else + log_info "✅ [检查] Python3环境可用: $(python3 --version)" + fi + + # 检查配置文件 + if [ ! -f "$config_path" ]; then + issues+=("配置文件不存在: $config_path") + else + # 验证JSON格式 + if python3 -c "import json; json.load(open('$config_path'))" 2>/dev/null; then + log_info "✅ [检查] 配置文件格式正确" + else + issues+=("配置文件格式错误或损坏") + fi + fi + + # 检查Cursor目录结构 + if [ ! -d "$cursor_app_data" ]; then + issues+=("Cursor应用数据目录不存在: $cursor_app_data") + fi + + # 检查Cursor应用安装 + if [ ! -d "$cursor_app_path" ]; then + issues+=("未找到Cursor应用安装: $cursor_app_path") + else + log_info "✅ [检查] 找到Cursor应用: $cursor_app_path" + fi + + # 检查目录权限 + if [ -d "$cursor_app_data" ] && [ ! -w "$cursor_app_data" ]; then + issues+=("Cursor应用数据目录无写入权限: $cursor_app_data") + fi + + # 返回检查结果 + if [ ${#issues[@]} -eq 0 ]; then + log_info "✅ [环境检查] 所有检查通过" + return 0 + else + log_error "❌ [环境检查] 发现 ${#issues[@]} 个问题:" + for issue in "${issues[@]}"; do + echo -e "${RED} • $issue${NC}" + done + return 1 + fi +} + +# 🚀 启动Cursor生成配置文件 +start_cursor_to_generate_config() { + log_info "🚀 [启动] 正在尝试启动Cursor生成配置文件..." + + local cursor_app_path="/Applications/Cursor.app" + local cursor_executable="$cursor_app_path/Contents/MacOS/Cursor" + + if [ ! -f "$cursor_executable" ]; then + log_error "❌ [错误] 未找到Cursor可执行文件: $cursor_executable" + return 1 + fi + + log_info "📍 [路径] 使用Cursor路径: $cursor_executable" + + # 启动Cursor + "$cursor_executable" > /dev/null 2>&1 & + local cursor_pid=$! + log_info "🚀 [启动] Cursor已启动,PID: $cursor_pid" + + log_info "⏳ [等待] 请等待Cursor完全加载(约30秒)..." + log_info "💡 [提示] 您可以在Cursor完全加载后手动关闭它" + + # 等待配置文件生成 + local config_path="$HOME/Library/Application Support/Cursor/User/globalStorage/storage.json" + local max_wait=60 + local waited=0 + + while [ ! -f "$config_path" ] && [ $waited -lt $max_wait ]; do + sleep 2 + waited=$((waited + 2)) + if [ $((waited % 10)) -eq 0 ]; then + log_info "⏳ [等待] 等待配置文件生成... ($waited/$max_wait 秒)" + fi + done + + if [ -f "$config_path" ]; then + log_info "✅ [成功] 配置文件已生成!" + log_info "💡 [提示] 现在可以关闭Cursor并重新运行脚本" + return 0 + else + log_warn "⚠️ [超时] 配置文件未在预期时间内生成" + log_info "💡 [建议] 请手动操作Cursor(如创建新文件)以触发配置生成" + return 1 + fi +} + +# 🛠️ 修改机器码配置(增强版) modify_machine_code_config() { + local mode=${1:-"FULL"} + echo log_info "🛠️ [配置] 正在修改机器码配置..." local config_path="$HOME/Library/Application Support/Cursor/User/globalStorage/storage.json" + # 增强的配置文件检查 if [ ! -f "$config_path" ]; then log_error "❌ [错误] 配置文件不存在: $config_path" - log_info "💡 [提示] 请手动启动Cursor一次,然后重新运行此脚本" + echo + log_info "💡 [解决方案] 请尝试以下步骤:" + echo -e "${BLUE} 1️⃣ 手动启动Cursor应用程序${NC}" + echo -e "${BLUE} 2️⃣ 等待Cursor完全加载(约30秒)${NC}" + echo -e "${BLUE} 3️⃣ 关闭Cursor应用程序${NC}" + echo -e "${BLUE} 4️⃣ 重新运行此脚本${NC}" + echo + log_warn "⚠️ [备选方案] 如果问题持续:" + echo -e "${BLUE} • 选择脚本的'重置环境+修改机器码'选项${NC}" + echo -e "${BLUE} • 该选项会自动生成配置文件${NC}" + echo + + # 提供用户选择 + read -p "是否现在尝试启动Cursor生成配置文件?(y/n): " user_choice + if [[ "$user_choice" =~ ^(y|yes)$ ]]; then + log_info "🚀 [尝试] 正在尝试启动Cursor..." + if start_cursor_to_generate_config; then + return 0 + fi + fi + + return 1 + fi + + # 验证配置文件格式 + log_info "🔍 [验证] 检查配置文件格式..." + if ! python3 -c "import json; json.load(open('$config_path'))" 2>/dev/null; then + log_error "❌ [错误] 配置文件格式错误或损坏" + log_info "💡 [建议] 配置文件可能已损坏,建议选择'重置环境+修改机器码'选项" return 1 fi + log_info "✅ [验证] 配置文件格式正确" + + # 显示操作进度 + log_info "⏳ [进度] 1/5 - 生成新的设备标识符..." # 生成新的ID local MAC_MACHINE_ID=$(uuidgen | tr '[:upper:]' '[:lower:]') @@ -335,18 +478,44 @@ modify_machine_code_config() { local MACHINE_ID="auth0|user_$(openssl rand -hex 32)" local SQM_ID="{$(uuidgen | tr '[:lower:]' '[:upper:]')}" - log_info "🔧 [生成] 已生成新的设备标识符" + log_info "✅ [进度] 1/5 - 设备标识符生成完成" - # 备份原始配置 + log_info "⏳ [进度] 2/5 - 创建备份目录..." + + # 备份原始配置(增强版) local backup_dir="$HOME/Library/Application Support/Cursor/User/globalStorage/backups" - mkdir -p "$backup_dir" + if ! mkdir -p "$backup_dir"; then + log_error "❌ [错误] 无法创建备份目录: $backup_dir" + return 1 + fi local backup_name="storage.json.backup_$(date +%Y%m%d_%H%M%S)" - cp "$config_path" "$backup_dir/$backup_name" - log_info "💾 [备份] 已备份原配置: $backup_name" + local backup_path="$backup_dir/$backup_name" + + log_info "⏳ [进度] 3/5 - 备份原始配置..." + if ! cp "$config_path" "$backup_path"; then + log_error "❌ [错误] 备份配置文件失败" + return 1 + fi + + # 验证备份是否成功 + if [ -f "$backup_path" ]; then + local backup_size=$(wc -c < "$backup_path") + local original_size=$(wc -c < "$config_path") + if [ "$backup_size" -eq "$original_size" ]; then + log_info "✅ [进度] 3/5 - 配置备份成功: $backup_name" + else + log_warn "⚠️ [警告] 备份文件大小不匹配,但继续执行" + fi + else + log_error "❌ [错误] 备份文件创建失败" + return 1 + fi + + log_info "⏳ [进度] 4/5 - 更新配置文件..." # 使用Python修改JSON配置(更可靠) - python3 -c " + local python_result=$(python3 -c " import json import sys @@ -366,18 +535,65 @@ try: except Exception as e: print(f'ERROR: {e}') sys.exit(1) -" 2>/dev/null - - if [ $? -eq 0 ]; then - log_info "✅ [成功] 机器码配置修改完成" - log_info "📋 [详情] 已更新以下标识符:" - echo " 🔹 machineId: ${MACHINE_ID:0:20}..." - echo " 🔹 macMachineId: $MAC_MACHINE_ID" - echo " 🔹 devDeviceId: $UUID" - echo " 🔹 sqmId: $SQM_ID" - return 0 +" 2>&1) + + if [ $? -eq 0 ] && [[ "$python_result" == "SUCCESS" ]]; then + log_info "⏳ [进度] 5/5 - 验证修改结果..." + + # 验证修改是否成功 + local verification_result=$(python3 -c " +import json +try: + with open('$config_path', 'r', encoding='utf-8') as f: + config = json.load(f) + + checks = [ + config.get('telemetry.machineId') == '$MACHINE_ID', + config.get('telemetry.macMachineId') == '$MAC_MACHINE_ID', + config.get('telemetry.devDeviceId') == '$UUID', + config.get('telemetry.sqmId') == '$SQM_ID' + ] + + if all(checks): + print('VERIFICATION_SUCCESS') + else: + print('VERIFICATION_FAILED') +except Exception as e: + print(f'VERIFICATION_ERROR: {e}') +" 2>&1) + + if [[ "$verification_result" == "VERIFICATION_SUCCESS" ]]; then + log_info "✅ [进度] 5/5 - 修改验证成功" + echo + log_info "🎉 [成功] 机器码配置修改完成!" + log_info "📋 [详情] 已更新以下标识符:" + echo " 🔹 machineId: ${MACHINE_ID:0:20}..." + echo " 🔹 macMachineId: $MAC_MACHINE_ID" + echo " 🔹 devDeviceId: $UUID" + echo " 🔹 sqmId: $SQM_ID" + echo + log_info "💾 [备份] 原配置已备份至: $backup_name" + return 0 + else + log_error "❌ [错误] 修改验证失败: $verification_result" + log_info "🔄 [恢复] 正在恢复备份..." + cp "$backup_path" "$config_path" + return 1 + fi else - log_error "❌ [错误] 修改配置失败" + log_error "❌ [错误] 修改配置失败: $python_result" + log_info "💡 [调试信息] Python执行结果: $python_result" + + # 尝试恢复备份 + if [ -f "$backup_path" ]; then + log_info "🔄 [恢复] 正在恢复备份配置..." + if cp "$backup_path" "$config_path"; then + log_info "✅ [恢复] 已恢复原始配置" + else + log_error "❌ [错误] 恢复备份失败" + fi + fi + return 1 fi } @@ -1678,11 +1894,30 @@ main() { if [ "$execute_mode" = "MODIFY_ONLY" ]; then log_info "🚀 [开始] 开始执行仅修改机器码功能..." - # 直接修改机器码配置,不进行文件夹删除和重启 - if modify_machine_code_config; then + # 先进行环境检查 + if ! test_cursor_environment "MODIFY_ONLY"; then + echo + log_error "❌ [环境检查失败] 无法继续执行" + echo + log_info "💡 [建议] 请选择以下操作:" + echo -e "${BLUE} 1️⃣ 选择'重置环境+修改机器码'选项(推荐)${NC}" + echo -e "${BLUE} 2️⃣ 手动启动Cursor一次,然后重新运行脚本${NC}" + echo -e "${BLUE} 3️⃣ 检查Cursor是否正确安装${NC}" + echo -e "${BLUE} 4️⃣ 安装Python3: brew install python3${NC}" + echo + read -p "按回车键退出..." + exit 1 + fi + + # 执行机器码修改 + if modify_machine_code_config "MODIFY_ONLY"; then + echo log_info "🎉 [完成] 机器码修改完成!" + log_info "💡 [提示] 现在可以启动Cursor使用新的机器码配置" else + echo log_error "❌ [失败] 机器码修改失败!" + log_info "💡 [建议] 请尝试'重置环境+修改机器码'选项" fi else # 完整的重置环境+修改机器码流程 diff --git a/scripts/run/cursor_win_id_modifier.ps1 b/scripts/run/cursor_win_id_modifier.ps1 index 2a90990..49e8f4a 100644 --- a/scripts/run/cursor_win_id_modifier.ps1 +++ b/scripts/run/cursor_win_id_modifier.ps1 @@ -209,20 +209,122 @@ function Restart-CursorAndWait { } } -# 🛠️ 修改机器码配置 +# � 检查配置文件和环境 +function Test-CursorEnvironment { + param( + [string]$Mode = "FULL" + ) + + Write-Host "" + Write-Host "$BLUE🔍 [环境检查]$NC 正在检查Cursor环境..." + + $configPath = "$env:APPDATA\Cursor\User\globalStorage\storage.json" + $cursorAppData = "$env:APPDATA\Cursor" + $issues = @() + + # 检查配置文件 + if (-not (Test-Path $configPath)) { + $issues += "配置文件不存在: $configPath" + } else { + try { + $content = Get-Content $configPath -Raw -Encoding UTF8 -ErrorAction Stop + $config = $content | ConvertFrom-Json -ErrorAction Stop + Write-Host "$GREEN✅ [检查]$NC 配置文件格式正确" + } catch { + $issues += "配置文件格式错误: $($_.Exception.Message)" + } + } + + # 检查Cursor目录结构 + if (-not (Test-Path $cursorAppData)) { + $issues += "Cursor应用数据目录不存在: $cursorAppData" + } + + # 检查Cursor安装 + $cursorPaths = @( + "$env:LOCALAPPDATA\Programs\cursor\Cursor.exe", + "$env:PROGRAMFILES\Cursor\Cursor.exe", + "$env:PROGRAMFILES(X86)\Cursor\Cursor.exe" + ) + + $cursorFound = $false + foreach ($path in $cursorPaths) { + if (Test-Path $path) { + Write-Host "$GREEN✅ [检查]$NC 找到Cursor安装: $path" + $cursorFound = $true + break + } + } + + if (-not $cursorFound) { + $issues += "未找到Cursor安装,请确认Cursor已正确安装" + } + + # 返回检查结果 + if ($issues.Count -eq 0) { + Write-Host "$GREEN✅ [环境检查]$NC 所有检查通过" + return @{ Success = $true; Issues = @() } + } else { + Write-Host "$RED❌ [环境检查]$NC 发现 $($issues.Count) 个问题:" + foreach ($issue in $issues) { + Write-Host "$RED • $issue$NC" + } + return @{ Success = $false; Issues = $issues } + } +} + +# �🛠️ 修改机器码配置(增强版) function Modify-MachineCodeConfig { + param( + [string]$Mode = "FULL" + ) + Write-Host "" Write-Host "$GREEN🛠️ [配置]$NC 正在修改机器码配置..." $configPath = "$env:APPDATA\Cursor\User\globalStorage\storage.json" + # 增强的配置文件检查 if (-not (Test-Path $configPath)) { Write-Host "$RED❌ [错误]$NC 配置文件不存在: $configPath" - Write-Host "$YELLOW💡 [提示]$NC 请手动启动Cursor一次,然后重新运行此脚本" + Write-Host "" + Write-Host "$YELLOW💡 [解决方案]$NC 请尝试以下步骤:" + Write-Host "$BLUE 1️⃣ 手动启动Cursor应用程序$NC" + Write-Host "$BLUE 2️⃣ 等待Cursor完全加载(约30秒)$NC" + Write-Host "$BLUE 3️⃣ 关闭Cursor应用程序$NC" + Write-Host "$BLUE 4️⃣ 重新运行此脚本$NC" + Write-Host "" + Write-Host "$YELLOW⚠️ [备选方案]$NC 如果问题持续:" + Write-Host "$BLUE • 选择脚本的'重置环境+修改机器码'选项$NC" + Write-Host "$BLUE • 该选项会自动生成配置文件$NC" + Write-Host "" + + # 提供用户选择 + $userChoice = Read-Host "是否现在尝试启动Cursor生成配置文件?(y/n)" + if ($userChoice -match "^(y|yes)$") { + Write-Host "$BLUE🚀 [尝试]$NC 正在尝试启动Cursor..." + return Start-CursorToGenerateConfig + } + return $false } + # 验证配置文件格式 try { + Write-Host "$BLUE🔍 [验证]$NC 检查配置文件格式..." + $originalContent = Get-Content $configPath -Raw -Encoding UTF8 -ErrorAction Stop + $config = $originalContent | ConvertFrom-Json -ErrorAction Stop + Write-Host "$GREEN✅ [验证]$NC 配置文件格式正确" + } catch { + Write-Host "$RED❌ [错误]$NC 配置文件格式错误: $($_.Exception.Message)" + Write-Host "$YELLOW💡 [建议]$NC 配置文件可能已损坏,建议选择'重置环境+修改机器码'选项" + return $false + } + + try { + # 显示操作进度 + Write-Host "$BLUE⏳ [进度]$NC 1/5 - 生成新的设备标识符..." + # 生成新的ID $MAC_MACHINE_ID = [System.Guid]::NewGuid().ToString() $UUID = [System.Guid]::NewGuid().ToString() @@ -236,21 +338,36 @@ function Modify-MachineCodeConfig { $MACHINE_ID = "$prefixHex$randomPart" $SQM_ID = "{$([System.Guid]::NewGuid().ToString().ToUpper())}" - Write-Host "$BLUE🔧 [生成]$NC 已生成新的设备标识符" + Write-Host "$GREEN✅ [进度]$NC 1/5 - 设备标识符生成完成" - # 读取并修改配置文件 - $originalContent = Get-Content $configPath -Raw -Encoding UTF8 - $config = $originalContent | ConvertFrom-Json + Write-Host "$BLUE⏳ [进度]$NC 2/5 - 创建备份目录..." - # 备份原始值 + # 备份原始值(增强版) $backupDir = "$env:APPDATA\Cursor\User\globalStorage\backups" if (-not (Test-Path $backupDir)) { - New-Item -ItemType Directory -Path $backupDir -Force | Out-Null + New-Item -ItemType Directory -Path $backupDir -Force -ErrorAction Stop | Out-Null } $backupName = "storage.json.backup_$(Get-Date -Format 'yyyyMMdd_HHmmss')" - Copy-Item $configPath "$backupDir\$backupName" - Write-Host "$GREEN💾 [备份]$NC 已备份原配置: $backupName" + $backupPath = "$backupDir\$backupName" + + Write-Host "$BLUE⏳ [进度]$NC 3/5 - 备份原始配置..." + Copy-Item $configPath $backupPath -ErrorAction Stop + + # 验证备份是否成功 + if (Test-Path $backupPath) { + $backupSize = (Get-Item $backupPath).Length + $originalSize = (Get-Item $configPath).Length + if ($backupSize -eq $originalSize) { + Write-Host "$GREEN✅ [进度]$NC 3/5 - 配置备份成功: $backupName" + } else { + Write-Host "$YELLOW⚠️ [警告]$NC 备份文件大小不匹配,但继续执行" + } + } else { + throw "备份文件创建失败" + } + + Write-Host "$BLUE⏳ [进度]$NC 4/5 - 更新配置文件..." # 更新配置值 $config.'telemetry.machineId' = $MACHINE_ID @@ -262,17 +379,121 @@ function Modify-MachineCodeConfig { $updatedJson = $config | ConvertTo-Json -Depth 10 [System.IO.File]::WriteAllText($configPath, $updatedJson, [System.Text.Encoding]::UTF8) - Write-Host "$GREEN✅ [成功]$NC 机器码配置修改完成" - Write-Host "$BLUE📋 [详情]$NC 已更新以下标识符:" - Write-Host " 🔹 machineId: $($MACHINE_ID.Substring(0,20))..." - Write-Host " 🔹 macMachineId: $MAC_MACHINE_ID" - Write-Host " 🔹 devDeviceId: $UUID" - Write-Host " 🔹 sqmId: $SQM_ID" + Write-Host "$BLUE⏳ [进度]$NC 5/5 - 验证修改结果..." - return $true + # 验证修改是否成功 + try { + $verifyContent = Get-Content $configPath -Raw -Encoding UTF8 + $verifyConfig = $verifyContent | ConvertFrom-Json + + $verificationPassed = $true + if ($verifyConfig.'telemetry.machineId' -ne $MACHINE_ID) { $verificationPassed = $false } + if ($verifyConfig.'telemetry.macMachineId' -ne $MAC_MACHINE_ID) { $verificationPassed = $false } + if ($verifyConfig.'telemetry.devDeviceId' -ne $UUID) { $verificationPassed = $false } + if ($verifyConfig.'telemetry.sqmId' -ne $SQM_ID) { $verificationPassed = $false } + + if ($verificationPassed) { + Write-Host "$GREEN✅ [进度]$NC 5/5 - 修改验证成功" + Write-Host "" + Write-Host "$GREEN🎉 [成功]$NC 机器码配置修改完成!" + Write-Host "$BLUE📋 [详情]$NC 已更新以下标识符:" + Write-Host " 🔹 machineId: $($MACHINE_ID.Substring(0,20))..." + Write-Host " 🔹 macMachineId: $MAC_MACHINE_ID" + Write-Host " 🔹 devDeviceId: $UUID" + Write-Host " 🔹 sqmId: $SQM_ID" + Write-Host "" + Write-Host "$GREEN💾 [备份]$NC 原配置已备份至: $backupName" + return $true + } else { + Write-Host "$RED❌ [错误]$NC 修改验证失败,正在恢复备份..." + Copy-Item $backupPath $configPath -Force + return $false + } + } catch { + Write-Host "$RED❌ [错误]$NC 验证过程出错: $($_.Exception.Message)" + Write-Host "$BLUE🔄 [恢复]$NC 正在恢复备份..." + Copy-Item $backupPath $configPath -Force + return $false + } } catch { Write-Host "$RED❌ [错误]$NC 修改配置失败: $($_.Exception.Message)" + Write-Host "$BLUE💡 [调试信息]$NC 错误类型: $($_.Exception.GetType().FullName)" + + # 尝试恢复备份(如果存在) + if ($backupPath -and (Test-Path $backupPath)) { + Write-Host "$BLUE🔄 [恢复]$NC 正在恢复备份配置..." + try { + Copy-Item $backupPath $configPath -Force + Write-Host "$GREEN✅ [恢复]$NC 已恢复原始配置" + } catch { + Write-Host "$RED❌ [错误]$NC 恢复备份失败: $($_.Exception.Message)" + } + } + + return $false + } +} + +# 🚀 启动Cursor生成配置文件 +function Start-CursorToGenerateConfig { + Write-Host "$BLUE🚀 [启动]$NC 正在尝试启动Cursor生成配置文件..." + + # 查找Cursor可执行文件 + $cursorPaths = @( + "$env:LOCALAPPDATA\Programs\cursor\Cursor.exe", + "$env:PROGRAMFILES\Cursor\Cursor.exe", + "$env:PROGRAMFILES(X86)\Cursor\Cursor.exe" + ) + + $cursorPath = $null + foreach ($path in $cursorPaths) { + if (Test-Path $path) { + $cursorPath = $path + break + } + } + + if (-not $cursorPath) { + Write-Host "$RED❌ [错误]$NC 未找到Cursor安装,请确认Cursor已正确安装" + return $false + } + + try { + Write-Host "$BLUE📍 [路径]$NC 使用Cursor路径: $cursorPath" + + # 启动Cursor + $process = Start-Process -FilePath $cursorPath -PassThru -WindowStyle Normal + Write-Host "$GREEN🚀 [启动]$NC Cursor已启动,PID: $($process.Id)" + + Write-Host "$YELLOW⏳ [等待]$NC 请等待Cursor完全加载(约30秒)..." + Write-Host "$BLUE💡 [提示]$NC 您可以在Cursor完全加载后手动关闭它" + + # 等待配置文件生成 + $configPath = "$env:APPDATA\Cursor\User\globalStorage\storage.json" + $maxWait = 60 + $waited = 0 + + while (-not (Test-Path $configPath) -and $waited -lt $maxWait) { + Start-Sleep -Seconds 2 + $waited += 2 + if ($waited % 10 -eq 0) { + Write-Host "$YELLOW⏳ [等待]$NC 等待配置文件生成... ($waited/$maxWait 秒)" + } + } + + if (Test-Path $configPath) { + Write-Host "$GREEN✅ [成功]$NC 配置文件已生成!" + Write-Host "$BLUE💡 [提示]$NC 现在可以关闭Cursor并重新运行脚本" + return $true + } else { + Write-Host "$YELLOW⚠️ [超时]$NC 配置文件未在预期时间内生成" + Write-Host "$BLUE💡 [建议]$NC 请手动操作Cursor(如创建新文件)以触发配置生成" + return $false + } + + } catch { + Write-Host "$RED❌ [错误]$NC 启动Cursor失败: $($_.Exception.Message)" return $false } } @@ -541,11 +762,33 @@ function Close-CursorProcessAndSaveInfo { if ($executeMode -eq "MODIFY_ONLY") { Write-Host "$GREEN🚀 [开始]$NC 开始执行仅修改机器码功能..." - # 直接修改机器码配置,不进行文件夹删除和重启 - if (Modify-MachineCodeConfig) { + # 先进行环境检查 + $envCheck = Test-CursorEnvironment -Mode "MODIFY_ONLY" + if (-not $envCheck.Success) { + Write-Host "" + Write-Host "$RED❌ [环境检查失败]$NC 无法继续执行,发现以下问题:" + foreach ($issue in $envCheck.Issues) { + Write-Host "$RED • $issue$NC" + } + Write-Host "" + Write-Host "$YELLOW💡 [建议]$NC 请选择以下操作:" + Write-Host "$BLUE 1️⃣ 选择'重置环境+修改机器码'选项(推荐)$NC" + Write-Host "$BLUE 2️⃣ 手动启动Cursor一次,然后重新运行脚本$NC" + Write-Host "$BLUE 3️⃣ 检查Cursor是否正确安装$NC" + Write-Host "" + Read-Host "按回车键退出" + exit 1 + } + + # 执行机器码修改 + if (Modify-MachineCodeConfig -Mode "MODIFY_ONLY") { + Write-Host "" Write-Host "$GREEN🎉 [完成]$NC 机器码修改完成!" + Write-Host "$BLUE💡 [提示]$NC 现在可以启动Cursor使用新的机器码配置" } else { + Write-Host "" Write-Host "$RED❌ [失败]$NC 机器码修改失败!" + Write-Host "$YELLOW💡 [建议]$NC 请尝试'重置环境+修改机器码'选项" } } else { # 完整的重置环境+修改机器码流程