少女祈祷中...
NEKO
知识库

codex 安装

windows 安装

powershell -ExecutionPolicy ByPass -c "irm https://chatgpt.com/codex/install.ps1 | iex"

  • 更新

codex update

  • 删除

# ============================================================
#  Codex 卸载脚本(保留配置与登录数据)
#  适用:通过 irm https://chatgpt.com/codex/install.ps1 | iex 安装
#  默认以当前用户身份运行即可,无需管理员
# ============================================================

$ErrorActionPreference = "Continue"

Write-Host "==> 停止 Codex 相关进程"
Get-Process *codex* -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
Start-Sleep -Milliseconds 300

# ---------- 解析安装路径(支持自定义环境变量) ----------
$codexHome = if ([string]::IsNullOrWhiteSpace($env:CODEX_HOME)) {
    Join-Path $env:USERPROFILE ".codex"
} else {
    $env:CODEX_HOME
}

$standaloneRoot = Join-Path $codexHome "packages\standalone"
$daemonRoot     = Join-Path $codexHome "packages\app-server-daemon"

$defaultVisibleBinDir = Join-Path $env:LOCALAPPDATA "Programs\OpenAI\Codex\bin"
$visibleBinDir = if ([string]::IsNullOrWhiteSpace($env:CODEX_INSTALL_DIR)) {
    $defaultVisibleBinDir
} else {
    $env:CODEX_INSTALL_DIR
}

# ---------- 1. 从用户 PATH 中移除安装目录 ----------
Write-Host "==> 从用户 PATH 中移除 $visibleBinDir"
$needle = $visibleBinDir.TrimEnd("\")
$userPath = [Environment]::GetEnvironmentVariable("Path", "User")
if (-not [string]::IsNullOrWhiteSpace($userPath)) {
    $segments = $userPath.Split(";", [System.StringSplitOptions]::RemoveEmptyEntries) |
        Where-Object { $_.TrimEnd("\") -ine $needle }
    $newUserPath = ($segments -join ";")
    if ($newUserPath -cne $userPath) {
        [Environment]::SetEnvironmentVariable("Path", $newUserPath, "User")
        Write-Host "    PATH 已更新"
    } else {
        Write-Host "    PATH 中未找到该项,跳过"
    }
} else {
    Write-Host "    用户 PATH 为空,跳过"
}

# 当前会话也同步移除,方便后续验证
$env:Path = (($env:Path.Split(";", [System.StringSplitOptions]::RemoveEmptyEntries) |
    Where-Object { $_.TrimEnd("\") -ine $needle }) -join ";")

# ---------- 2. 删除可见 bin 的 Junction ----------
Write-Host "==> 删除 Junction: $visibleBinDir"
if (Test-Path -LiteralPath $visibleBinDir) {
    $item = Get-Item -LiteralPath $visibleBinDir -Force
    if (($item.Attributes -band [IO.FileAttributes]::ReparsePoint) -and $item.LinkType -eq "Junction") {
        # 用 cmd rmdir 删除联接本身,不会跟随到目标
        cmd /c rmdir "$visibleBinDir" 2>$null | Out-Null
    }
    if (Test-Path -LiteralPath $visibleBinDir) {
        Remove-Item -LiteralPath $visibleBinDir -Recurse -Force -ErrorAction SilentlyContinue
    }
} else {
    Write-Host "    不存在,跳过"
}

# 删除 OpenAI\Codex 上层目录(若已空)
$openAiCodexParent = Split-Path -Parent $visibleBinDir          # ...\Codex
$openAiParent      = Split-Path -Parent $openAiCodexParent      # ...\OpenAI
foreach ($p in @($openAiCodexParent, $openAiParent)) {
    if ($p -and (Test-Path -LiteralPath $p)) {
        $children = Get-ChildItem -LiteralPath $p -Force -ErrorAction SilentlyContinue
        if (-not $children) {
            Remove-Item -LiteralPath $p -Force -ErrorAction SilentlyContinue
            Write-Host "    删除空目录: $p"
        }
    }
}

# ---------- 3. 删除程序本体(保留 .codex 其余内容) ----------
Write-Host "==> 删除 standalone 程序目录: $standaloneRoot"
if (Test-Path -LiteralPath $standaloneRoot) {
    Remove-Item -LiteralPath $standaloneRoot -Recurse -Force -ErrorAction SilentlyContinue
} else {
    Write-Host "    不存在,跳过"
}

Write-Host "==> 删除 daemon-only 程序目录: $daemonRoot"
if (Test-Path -LiteralPath $daemonRoot) {
    Remove-Item -LiteralPath $daemonRoot -Recurse -Force -ErrorAction SilentlyContinue
} else {
    Write-Host "    不存在,跳过"
}

# 若 packages 目录已空,则删除 packages 本身
$packagesDir = Join-Path $codexHome "packages"
if (Test-Path -LiteralPath $packagesDir) {
    $left = Get-ChildItem -LiteralPath $packagesDir -Force -ErrorAction SilentlyContinue
    if (-not $left) {
        Remove-Item -LiteralPath $packagesDir -Force -ErrorAction SilentlyContinue
        Write-Host "    删除空目录: $packagesDir"
    }
}

# ---------- 4. 校验 ----------
Write-Host ""
Write-Host "==> 校验结果"
$cmd = Get-Command codex -ErrorAction SilentlyContinue
if ($null -eq $cmd) {
    Write-Host "    codex 命令已不可用 ✔"
} else {
    Write-Host "    仍可找到 codex: $($cmd.Source)"
    Write-Host "    (可能是 npm/bun 等其他安装方式残留)"
}

Write-Host ""
Write-Host "已保留的用户数据:"
foreach ($name in @("config.toml", "auth.json", "sessions", "history.jsonl", "log")) {
    $p = Join-Path $codexHome $name
    if (Test-Path -LiteralPath $p) {
        Write-Host "    $p"
    }
}

Write-Host ""
Write-Host "Codex 程序卸载完成,配置与登录数据已保留。"
Write-Host "请打开新的 PowerShell 窗口使 PATH 变更生效。"

rockylinux 安装

curl -fsSL https://chatgpt.com/codex/install.sh | sh

  • 更新

codex update

评论