无限免费试用 Cursor Pro:单账号避开设备限制
如何仅用一个账号无限免费试用 Cursor Pro,避免“此设备已使用过多免费试用账号”检测 nb,666666 蚌,我还以为是教程,结果是求助{tieba33} 这个需要重置cursor机器码的,分别是两个系统的。。。Windows:# 设置输出编码为 UTF-8
$OutputEncoding = ::UTF8
::OutputEncoding = ::UTF8
# 颜色定义
$RED = "`e[31m"
$GREEN = "`e[32m"
$YELLOW = "`e[33m"
$BLUE = "`e[34m"
$NC = "`e[0m"
# 配置文件路径
$STORAGE_FILE = "$env:APPDATA\Cursor\User\globalStorage\storage.json"
$BACKUP_DIR = "$env:APPDATA\Cursor\User\globalStorage\backups"
# 检查管理员权限
function Test-Administrator {
$user = ::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($user)
return $principal.IsInRole(::Administrator)
}
if (-not (Test-Administrator)) {
Write-Host "$RED[错误]$NC 请以管理员身份运行此脚本"
Write-Host "请右键点击脚本,选择'以管理员身份运行'"
Read-Host "按回车键退出"
exit 1
}
# 显示 Logo
Clear-Host
Write-Host @"
██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗
██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝
██║ ██║ ██║██╔══██╗╚════██║██║ ██║██╔══██╗
╚██████╗╚██████╔╝██║██║███████║╚██████╔╝██║██║
╚═════╝ ╚═════╝ ╚═╝╚═╝╚══════╝ ╚═════╝ ╚═╝╚═╝
"@
Write-Host "$BLUE================================$NC"
Write-Host "$BLUE================================$NC"
Write-Host ""
# 获取并显示 Cursor 版本
function Get-CursorVersion {
try {
# 主要检测路径
$packagePath = "$env:LOCALAPPDATA\Programs\cursor\resources\app\package.json"
if (Test-Path $packagePath) {
$packageJson = Get-Content $packagePath -Raw | ConvertFrom-Json
if ($packageJson.version) {
Write-Host "$GREEN[信息]$NC 当前安装的 Cursor 版本: v$($packageJson.version)"
return $packageJson.version
}
}
# 备用路径检测
$altPath = "$env:LOCALAPPDATA\cursor\resources\app\package.json"
if (Test-Path $altPath) {
$packageJson = Get-Content $altPath -Raw | ConvertFrom-Json
if ($packageJson.version) {
Write-Host "$GREEN[信息]$NC 当前安装的 Cursor 版本: v$($packageJson.version)"
return $packageJson.version
}
}
Write-Host "$YELLOW[警告]$NC 无法检测到 Cursor 版本"
Write-Host "$YELLOW[提示]$NC 请确保 Cursor 已正确安装"
return $null
}
catch {
Write-Host "$RED[错误]$NC 获取 Cursor 版本失败: $_"
return $null
}
}
# 获取并显示版本信息
$cursorVersion = Get-CursorVersion
Write-Host ""
Write-Host "$YELLOW[重要提示]$NC 最新的 0.49.x (以支持)"
Write-Host ""
# 检查并关闭 Cursor 进程
Write-Host "$GREEN[信息]$NC 检查 Cursor 进程..."
function Get-ProcessDetails {
param($processName)
Write-Host "$BLUE[调试]$NC 正在获取 $processName 进程详细信息:"
Get-WmiObject Win32_Process -Filter "name='$processName'" |
Select-Object ProcessId, ExecutablePath, CommandLine |
Format-List
}
# 定义最大重试次数和等待时间
$MAX_RETRIES = 5
$WAIT_TIME = 1
# 处理进程关闭
function Close-CursorProcess {
param($processName)
$process = Get-Process -Name $processName -ErrorAction SilentlyContinue
if ($process) {
Write-Host "$YELLOW[警告]$NC 发现 $processName 正在运行"
Get-ProcessDetails $processName
Write-Host "$YELLOW[警告]$NC 尝试关闭 $processName..."
Stop-Process -Name $processName -Force
$retryCount = 0
while ($retryCount -lt $MAX_RETRIES) {
$process = Get-Process -Name $processName -ErrorAction SilentlyContinue
if (-not $process) { break }
$retryCount++
if ($retryCount -ge $MAX_RETRIES) {
Write-Host "$RED[错误]$NC 在 $MAX_RETRIES 次尝试后仍无法关闭 $processName"
Get-ProcessDetails $processName
Write-Host "$RED[错误]$NC 请手动关闭进程后重试"
Read-Host "按回车键退出"
exit 1
}
Write-Host "$YELLOW[警告]$NC 等待进程关闭,尝试 $retryCount/$MAX_RETRIES..."
Start-Sleep -Seconds $WAIT_TIME
}
Write-Host "$GREEN[信息]$NC $processName 已成功关闭"
}
}
# 关闭所有 Cursor 进程
Close-CursorProcess "Cursor"
Close-CursorProcess "cursor"
# 创建备份目录
if (-not (Test-Path $BACKUP_DIR)) {
New-Item -ItemType Directory -Path $BACKUP_DIR | Out-Null
}
# 备份现有配置
if (Test-Path $STORAGE_FILE) {
Write-Host "$GREEN[信息]$NC 正在备份配置文件..."
$backupName = "storage.json.backup_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
Copy-Item $STORAGE_FILE "$BACKUP_DIR\$backupName"
}
# 生成新的 ID
Write-Host "$GREEN[信息]$NC 正在生成新的 ID..."
# 在颜色定义后添加此函数
function Get-RandomHex {
param (
$length
)
$bytes = New-Object byte[] ($length)
$rng = ::new()
$rng.GetBytes($bytes)
$hexString = ::ToString($bytes) -replace '-',''
$rng.Dispose()
return $hexString
}
# 改进 ID 生成函数
function New-StandardMachineId {
$template = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
$result = $template -replace '', {
param($match)
$r = ::new().Next(16)
$v = if ($match.Value -eq "x") { $r } else { ($r -band 0x3) -bor 0x8 }
return $v.ToString("x")
}
return $result
}
# 在生成 ID 时使用新函数
$MAC_MACHINE_ID = New-StandardMachineId
$UUID = ::NewGuid().ToString()
# 将 auth0|user_ 转换为字节数组的十六进制
$prefixBytes = ::UTF8.GetBytes("auth0|user_")
$prefixHex = -join ($prefixBytes | ForEach-Object { '{0:x2}' -f $_ })
# 生成32字节(64个十六进制字符)的随机数作为 machineId 的随机部分
$randomPart = Get-RandomHex -length 32
$MACHINE_ID = "$prefixHex$randomPart"
$SQM_ID = "{$(::NewGuid().ToString().ToUpper())}"
# 在Update-MachineGuid函数前添加权限检查
if (-NOT (::GetCurrent()).IsInRole( "Administrator")) {
Write-Host "$RED[错误]$NC 请使用管理员权限运行此脚本"
Start-Process powershell "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
exit
}
function Update-MachineGuid {
try {
# 检查注册表路径是否存在,不存在则创建
$registryPath = "HKLM:\SOFTWARE\Microsoft\Cryptography"
if (-not (Test-Path $registryPath)) {
Write-Host "$YELLOW[警告]$NC 注册表路径不存在: $registryPath,正在创建..."
New-Item -Path $registryPath -Force | Out-Null
Write-Host "$GREEN[信息]$NC 注册表路径创建成功"
}
# 获取当前的 MachineGuid,如果不存在则使用空字符串作为默认值
$originalGuid = ""
try {
$currentGuid = Get-ItemProperty -Path $registryPath -Name MachineGuid -ErrorAction SilentlyContinue
if ($currentGuid) {
$originalGuid = $currentGuid.MachineGuid
Write-Host "$GREEN[信息]$NC 当前注册表值:"
Write-Host "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography"
Write-Host " MachineGuid REG_SZ $originalGuid"
} else {
Write-Host "$YELLOW[警告]$NC MachineGuid 值不存在,将创建新值"
}
} catch {
Write-Host "$YELLOW[警告]$NC 获取 MachineGuid 失败: $($_.Exception.Message)"
}
# 创建备份目录(如果不存在)
if (-not (Test-Path $BACKUP_DIR)) {
New-Item -ItemType Directory -Path $BACKUP_DIR -Force | Out-Null
}
# 创建备份文件(仅当原始值存在时)
if ($originalGuid) {
$backupFile = "$BACKUP_DIR\MachineGuid_$(Get-Date -Format 'yyyyMMdd_HHmmss').reg"
$backupResult = Start-Process "reg.exe" -ArgumentList "export", "`"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography`"", "`"$backupFile`"" -NoNewWindow -Wait -PassThru
if ($backupResult.ExitCode -eq 0) {
Write-Host "$GREEN[信息]$NC 注册表项已备份到:$backupFile"
} else {
Write-Host "$YELLOW[警告]$NC 备份创建失败,继续执行..."
}
}
# 生成新GUID
$newGuid = ::NewGuid().ToString()
# 更新或创建注册表值
Set-ItemProperty -Path $registryPath -Name MachineGuid -Value $newGuid -Force -ErrorAction Stop
# 验证更新
$verifyGuid = (Get-ItemProperty -Path $registryPath -Name MachineGuid -ErrorAction Stop).MachineGuid
if ($verifyGuid -ne $newGuid) {
throw "注册表验证失败:更新后的值 ($verifyGuid) 与预期值 ($newGuid) 不匹配"
}
Write-Host "$GREEN[信息]$NC 注册表更新成功:"
Write-Host "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography"
Write-Host " MachineGuid REG_SZ $newGuid"
return $true
}
catch {
Write-Host "$RED[错误]$NC 注册表操作失败:$($_.Exception.Message)"
# 尝试恢复备份(如果存在)
if (($backupFile -ne $null) -and (Test-Path $backupFile)) {
Write-Host "$YELLOW[恢复]$NC 正在从备份恢复..."
$restoreResult = Start-Process "reg.exe" -ArgumentList "import", "`"$backupFile`"" -NoNewWindow -Wait -PassThru
if ($restoreResult.ExitCode -eq 0) {
Write-Host "$GREEN[恢复成功]$NC 已还原原始注册表值"
} else {
Write-Host "$RED[错误]$NC 恢复失败,请手动导入备份文件:$backupFile"
}
} else {
Write-Host "$YELLOW[警告]$NC 未找到备份文件或备份创建失败,无法自动恢复"
}
return $false
}
}
# 创建或更新配置文件
Write-Host "$GREEN[信息]$NC 正在更新配置..."
try {
# 检查配置文件是否存在
if (-not (Test-Path $STORAGE_FILE)) {
Write-Host "$RED[错误]$NC 未找到配置文件: $STORAGE_FILE"
Write-Host "$YELLOW[提示]$NC 请先安装并运行一次 Cursor 后再使用此脚本"
Read-Host "按回车键退出"
exit 1
}
# 读取现有配置文件
try {
$originalContent = Get-Content $STORAGE_FILE -Raw -Encoding UTF8
# 将 JSON 字符串转换为 PowerShell 对象
$config = $originalContent | ConvertFrom-Json
# 备份当前值
$oldValues = @{
'machineId' = $config.'telemetry.machineId'
'macMachineId' = $config.'telemetry.macMachineId'
'devDeviceId' = $config.'telemetry.devDeviceId'
'sqmId' = $config.'telemetry.sqmId'
}
# 更新特定的值
$config.'telemetry.machineId' = $MACHINE_ID
$config.'telemetry.macMachineId' = $MAC_MACHINE_ID
$config.'telemetry.devDeviceId' = $UUID
$config.'telemetry.sqmId' = $SQM_ID
# 将更新后的对象转换回 JSON 并保存
$updatedJson = $config | ConvertTo-Json -Depth 10
::WriteAllText(
::GetFullPath($STORAGE_FILE),
$updatedJson,
::UTF8
)
Write-Host "$GREEN[信息]$NC 成功更新配置文件"
} catch {
# 如果出错,尝试恢复原始内容
if ($originalContent) {
::WriteAllText(
::GetFullPath($STORAGE_FILE),
$originalContent,
::UTF8
)
}
throw "处理 JSON 失败: $_"
}
# 直接执行更新 MachineGuid,不再询问
Update-MachineGuid
# 显示结果
Write-Host ""
Write-Host "$GREEN[信息]$NC 已更新配置:"
Write-Host "$BLUE[调试]$NC machineId: $MACHINE_ID"
Write-Host "$BLUE[调试]$NC macMachineId: $MAC_MACHINE_ID"
Write-Host "$BLUE[调试]$NC devDeviceId: $UUID"
Write-Host "$BLUE[调试]$NC sqmId: $SQM_ID"
# 显示文件树结构
Write-Host ""
Write-Host "$GREEN[信息]$NC 文件结构:"
Write-Host "$BLUE$env:APPDATA\Cursor\User$NC"
Write-Host "├── globalStorage"
Write-Host "│ ├── storage.json (已修改)"
Write-Host "│ └── backups"
# 列出备份文件
$backupFiles = Get-ChildItem "$BACKUP_DIR\*" -ErrorAction SilentlyContinue
if ($backupFiles) {
foreach ($file in $backupFiles) {
Write-Host "│ └── $($file.Name)"
}
} else {
Write-Host "│ └── (空)"
}
# 显示公众号信息
Write-Host ""
Write-Host "$GREEN================================$NC"
Write-Host "$GREEN================================$NC"
Write-Host ""
Write-Host "$GREEN[信息]$NC 请重启 Cursor 以应用新的配置"
Write-Host ""
# 询问是否要禁用自动更新
Write-Host ""
Write-Host "$YELLOW[询问]$NC 是否要禁用 Cursor 自动更新功能?"
Write-Host "0) 否 - 保持默认设置 (按回车键)"
Write-Host "1) 是 - 禁用自动更新"
$choice = Read-Host "请输入选项 (0)"
if ($choice -eq "1") {
Write-Host ""
Write-Host "$GREEN[信息]$NC 正在处理自动更新..."
$updaterPath = "$env:LOCALAPPDATA\cursor-updater"
# 定义手动设置教程
function Show-ManualGuide {
Write-Host ""
Write-Host "$YELLOW[警告]$NC 自动设置失败,请尝试手动操作:"
Write-Host "$YELLOW手动禁用更新步骤:$NC"
Write-Host "1. 以管理员身份打开 PowerShell"
Write-Host "2. 复制粘贴以下命令:"
Write-Host "$BLUE命令1 - 删除现有目录(如果存在):$NC"
Write-Host "Remove-Item -Path `"$updaterPath`" -Force -Recurse -ErrorAction SilentlyContinue"
Write-Host ""
Write-Host "$BLUE命令2 - 创建阻止文件:$NC"
Write-Host "New-Item -Path `"$updaterPath`" -ItemType File -Force | Out-Null"
Write-Host ""
Write-Host "$BLUE命令3 - 设置只读属性:$NC"
Write-Host "Set-ItemProperty -Path `"$updaterPath`" -Name IsReadOnly -Value `$true"
Write-Host ""
Write-Host "$BLUE命令4 - 设置权限(可选):$NC"
Write-Host "icacls `"$updaterPath`" /inheritance:r /grant:r `"`$($env:USERNAME):(R)`""
Write-Host ""
Write-Host "$YELLOW验证方法:$NC"
Write-Host "1. 运行命令:Get-ItemProperty `"$updaterPath`""
Write-Host "2. 确认 IsReadOnly 属性为 True"
Write-Host "3. 运行命令:icacls `"$updaterPath`""
Write-Host "4. 确认只有读取权限"
Write-Host ""
Write-Host "$YELLOW[提示]$NC 完成后请重启 Cursor"
}
try {
# 检查cursor-updater是否存在
if (Test-Path $updaterPath) {
# 如果是文件,说明已经创建了阻止更新
if ((Get-Item $updaterPath) -is ) {
Write-Host "$GREEN[信息]$NC 已创建阻止更新文件,无需再次阻止"
return
}
# 如果是目录,尝试删除
else {
try {
Remove-Item -Path $updaterPath -Force -Recurse -ErrorAction Stop
Write-Host "$GREEN[信息]$NC 成功删除 cursor-updater 目录"
}
catch {
Write-Host "$RED[错误]$NC 删除 cursor-updater 目录失败"
Show-ManualGuide
return
}
}
}
# 创建阻止文件
try {
New-Item -Path $updaterPath -ItemType File -Force -ErrorAction Stop | Out-Null
Write-Host "$GREEN[信息]$NC 成功创建阻止文件"
}
catch {
Write-Host "$RED[错误]$NC 创建阻止文件失败"
Show-ManualGuide
return
}
# 设置文件权限
try {
# 设置只读属性
Set-ItemProperty -Path $updaterPath -Name IsReadOnly -Value $true -ErrorAction Stop
# 使用 icacls 设置权限
$result = Start-Process "icacls.exe" -ArgumentList "`"$updaterPath`" /inheritance:r /grant:r `"$($env:USERNAME):(R)`"" -Wait -NoNewWindow -PassThru
if ($result.ExitCode -ne 0) {
throw "icacls 命令失败"
}
Write-Host "$GREEN[信息]$NC 成功设置文件权限"
}
catch {
Write-Host "$RED[错误]$NC 设置文件权限失败"
Show-ManualGuide
return
}
# 验证设置
try {
$fileInfo = Get-ItemProperty $updaterPath
if (-not $fileInfo.IsReadOnly) {
Write-Host "$RED[错误]$NC 验证失败:文件权限设置可能未生效"
Show-ManualGuide
return
}
}
catch {
Write-Host "$RED[错误]$NC 验证设置失败"
Show-ManualGuide
return
}
Write-Host "$GREEN[信息]$NC 成功禁用自动更新"
}
catch {
Write-Host "$RED[错误]$NC 发生未知错误: $_"
Show-ManualGuide
}
}
else {
Write-Host "$GREEN[信息]$NC 保持默认设置,不进行更改"
}
# 保留有效的注册表更新
Update-MachineGuid
} catch {
Write-Host "$RED[错误]$NC 主要操作失败: $_"
Write-Host "$YELLOW[尝试]$NC 使用备选方法..."
try {
# 备选方法:使用 Add-Content
$tempFile = ::GetTempFileName()
$config | ConvertTo-Json | Set-Content -Path $tempFile -Encoding UTF8
Copy-Item -Path $tempFile -Destination $STORAGE_FILE -Force
Remove-Item -Path $tempFile
Write-Host "$GREEN[信息]$NC 使用备选方法成功写入配置"
} catch {
Write-Host "$RED[错误]$NC 所有尝试都失败了"
Write-Host "错误详情: $_"
Write-Host "目标文件: $STORAGE_FILE"
Write-Host "请确保您有足够的权限访问该文件"
Read-Host "按回车键退出"
exit 1
}
}
Write-Host ""
Read-Host "按回车键退出"
exit 0
# 在文件写入部分修改
function Write-ConfigFile {
param($config, $filePath)
try {
# 使用 UTF8 无 BOM 编码
$utf8NoBom = New-Object System.Text.UTF8Encoding $false
$jsonContent = $config | ConvertTo-Json -Depth 10
# 统一使用 LF 换行符
$jsonContent = $jsonContent.Replace("`r`n", "`n")
::WriteAllText(
::GetFullPath($filePath),
$jsonContent,
$utf8NoBom
)
Write-Host "$GREEN[信息]$NC 成功写入配置文件(UTF8 无 BOM)"
}
catch {
throw "写入配置文件失败: $_"
}
}
# 获取并显示版本信息
$cursorVersion = Get-CursorVersion
Write-Host ""
if ($cursorVersion) {
Write-Host "$GREEN[信息]$NC 检测到 Cursor 版本: $cursorVersion,继续执行..."
} else {
Write-Host "$YELLOW[警告]$NC 无法检测版本,将继续执行..."
}macOS:# --- Terminal Colors and Formatting ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
DIM='\033[2m'
NC='\033[0m' # No Color
TICK="${GREEN}✓${NC}"
CROSS="${RED}✗${NC}"
INFO="${BLUE}ℹ${NC}"
WARN="${YELLOW}⚠${NC}"
# --- Spinner Animation ---
spinner() {
local pid=$1
local delay=0.1
local spinstr='|/-\'
local msg="$2"
printf "${DIM}%s" "$msg"
while kill -0 $pid 2>/dev/null; do
local temp=${spinstr#?}
printf "\r${CYAN}[%c]${NC} %s" "$spinstr" "$msg"
local spinstr=$temp${spinstr%"$temp"}
sleep $delay
done
printf "\r${TICK} %s\n" "$msg"
}
# --- Progress Bar ---
progress_bar() {
local duration=$1
local msg="$2"
local width=40
local progress=0
local fill
local remain
echo -ne "\n${msg}\n"
while [ $progress -le 100 ]; do
let fill=($width*$progress/100)
let remain=$width-$fill
printf "\r${CYAN}[${NC}"
printf "%${fill}s" '' | tr ' ' '█'
printf "%${remain}s" '' | tr ' ' '░'
printf "${CYAN}]${NC} ${progress}%%"
progress=$((progress + 2))
sleep 0.06# Adjusted for macOS
done
echo -e "\n"
}
# --- Fancy Print Functions ---
print_header() {
clear
echo -e "\n${CYAN}════════════════════════════════════════════════════════════════════${NC}"
echo -e "${BOLD}${BLUE} Cursor Cleaner & Identity Reset Script for macOS${NC}"
echo -e "${CYAN}════════════════════════════════════════════════════════════════════${NC}\n"
}
print_section() {
echo -e "\n${MAGENTA}▓▒░ ${BOLD}$1${NC} ${MAGENTA}░▒▓${NC}"
echo -e "${DIM}${MAGENTA}──────────────────────────────────────────${NC}\n"
}
print_warning() {
echo -e "${WARN} ${YELLOW}$1${NC}"
}
print_info() {
echo -e "${INFO} ${BLUE}$1${NC}"
}
print_success() {
echo -e "${TICK} ${GREEN}$1${NC}"
}
print_error() {
echo -e "${CROSS} ${RED}$1${NC}" >&2
}
# --- Function for running commands with sudo ---
run_sudo() {
echo -e "${INFO} Running: ${CYAN}$@${NC}"
if ! sudo "$@"; then
print_error "Failed to execute sudo command: '$@'"
fi
}
# --- Initial Checks and Confirmation ---
print_header
# Check if running on macOS
if [[ "$OSTYPE" != "darwin"* ]]; then
print_error "This script is designed for macOS only!"
exit 1
fi
# Display warnings
print_section "IMPORTANT WARNINGS"
print_warning "This script performs destructive operations that cannot be undone!"
print_warning "All Cursor settings and data will be permanently deleted."
print_warning "A system restart is recommended after completion."
echo
# Display actions
print_section "ACTIONS TO BE PERFORMED"
print_info "1. Stop running Cursor processes"
print_info "2. Remove Cursor.app from Applications"
print_info "3. Delete configuration and cache data"
print_info "4. Clean up system preferences"
print_info "5. Clear launch services database"
print_info "6. Remove quarantine attributes"
echo
# Get confirmation
echo -e "${YELLOW}${BOLD}Do you understand and accept the risks?${NC}"
read -p "Type 'YES' in uppercase to confirm: " CONFIRMATION
if [[ "$CONFIRMATION" != "YES" ]]; then
print_error "Operation cancelled by user"
exit 1
fi
# --- Main Operations ---
print_section "STARTING CLEANUP PROCESS"
# Stop Cursor Process
print_info "Stopping Cursor processes..."
(pkill -f "Cursor" 2>/dev/null || true) &
spinner $! "Terminating running instances"
# Wait a moment for processes to terminate
sleep 2
# Remove Application
print_info "Removing Cursor application..."
if [ -d "/Applications/Cursor.app" ]; then
(sudo rm -rf "/Applications/Cursor.app") &
spinner $! "Removing Cursor.app from Applications"
else
print_info "Cursor.app not found in /Applications"
fi
# Check for app in user Applications folder
if [ -d "$HOME/Applications/Cursor.app" ]; then
(rm -rf "$HOME/Applications/Cursor.app") &
spinner $! "Removing Cursor.app from user Applications"
fi
# Remove User Config/Data with progress simulation
print_section "CLEANING USER DATA"
# macOS specific directories
CONFIG_DIRS=(
"$HOME/Library/Application Support/Cursor"
"$HOME/Library/Caches/Cursor"
"$HOME/Library/Caches/com.todesktop.230313mzl4w4u92"
"$HOME/Library/Preferences/com.todesktop.230313mzl4w4u92.plist"
"$HOME/Library/Preferences/cursor.plist"
"$HOME/Library/Saved Application State/com.todesktop.230313mzl4w4u92.savedState"
"$HOME/Library/WebKit/Cursor"
"$HOME/Library/HTTPStorages/com.todesktop.230313mzl4w4u92"
"$HOME/.cursor"
"$HOME/.cursor-server"
)
progress_bar 3 "Removing configuration directories..."
for item in "${CONFIG_DIRS[@]}"; do
if [ -e "$item" ]; then
rm -rf "$item"
print_success "Removed: $(basename "$item")"
else
print_info "Skipped: $(basename "$item") (not found)"
fi
done
# Clean up LaunchAgents
print_section "CLEANING LAUNCH AGENTS"
LAUNCH_AGENTS=(
"$HOME/Library/LaunchAgents/com.todesktop.230313mzl4w4u92.plist"
"$HOME/Library/LaunchAgents/cursor.plist"
)
for agent in "${LAUNCH_AGENTS[@]}"; do
if [ -f "$agent" ]; then
launchctl unload "$agent" 2>/dev/null
rm -f "$agent"
print_success "Removed launch agent: $(basename "$agent")"
fi
done
# # Clear Quarantine Attributes
# print_section "CLEARING SYSTEM ATTRIBUTES"
# print_info "Removing quarantine attributes..."
# sudo xattr -r -d com.apple.quarantine /Applications/Cursor.app 2>/dev/null || true
# Reset Launch Services Database
print_info "Resetting Launch Services database..."
(
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister \
-kill -r -domain local -domain system -domain user
) &
spinner $! "Rebuilding Launch Services"
# Clear DNS Cache (might help with online verification)
print_section "CLEARING SYSTEM CACHES"
print_info "Flushing DNS cache..."
sudo dscacheutil -flushcache 2>/dev/null &
spinner $! "Flushing DNS"
# Clear Spotlight Index for Cursor
# print_info "Clearing Spotlight index..."
# sudo mdutil -E / 2>/dev/null || true
# Clear Keychain entries
print_section "CLEANING KEYCHAIN"
print_info "Removing Cursor keychain entries..."
security delete-generic-password -s "Cursor" 2>/dev/null || true
security delete-generic-password -s "com.todesktop.230313mzl4w4u92" 2>/dev/null || true
# System Information
print_section "SYSTEM INFORMATION"
echo -e "${CYAN}Hardware UUID:${NC}"
system_profiler SPHardwareDataType | grep "Hardware UUID" | awk '{print $3}'
echo -e "\n${DIM}Note: Hardware UUID cannot be changed without significant system modifications${NC}"
# Final Cleanup
print_section "FINAL CLEANUP"
progress_bar 2 "Cleaning system caches..."
# Empty Trash (optional - commented out for safety)
# osascript -e 'tell application "Finder" to empty trash' 2>/dev/null || true
# Final Instructions
echo -e "\n${CYAN}════════════════════════════════════════════════════════════════════${NC}"
echo -e "${GREEN}${BOLD} ✨ CLEANUP COMPLETE! ✨${NC}"
echo -e "${CYAN}════════════════════════════════════════════════════════════════════${NC}\n"
print_warning "A SYSTEM RESTART IS RECOMMENDED TO COMPLETE THE PROCESS"
print_info "Some changes may not take effect until after restart"
echo -e "\n${BOLD}Would you like to restart now? ${NC}(y/N): "
read -n 1 -r
echo
if [[ $REPLY =~ ^$ ]]; then
echo -e "\n${YELLOW}System will restart in 10 seconds...${NC}"
echo -e "${DIM}Press Ctrl+C to cancel${NC}"
sleep 10
sudo shutdown -r now
else
print_info "Please remember to restart your system manually"
print_info "You can restart using: ${CYAN}sudo shutdown -r now${NC}"
print_info "Or via Apple Menu > Restart"
fi
exit 0
还是求助啊? 菊部地区小雨 发表于 2025-11-8 21:10
这个需要重置cursor机器码的,分别是两个系统的。。。
Windows:macOS:
强的 这必须得看!! 666666 菊部地区小雨 发表于 2025-11-8 21:10
这个需要重置cursor机器码的,分别是两个系统的。。。
Windows:macOS:
谢谢
页:
[1]