Skip to content

fix(install): Windows 安装脚本在 kimi.exe 运行时因 .bak 文件被锁定而失败 #1177

Description

@MicroGery

What version of Kimi Code is running?

0.20.1

Which open platform/subscription were you using?

Windows 11

Which model were you using?

K2.7 Code High Speed

What platform is your computer?

Microsoft Windows NT 10.0.26100.0 x64

What issue are you seeing?

当 kimi.exe 正在运行时,重复执行安装脚本会失败,报错:
ERROR: 当文件已存在时,无法创建该文件。

Root Cause Analysis

这是 Windows PE 加载器的行为:运行中的进程会持有其可执行文件的映像句柄。Windows 允许重命名正在运行的 .exe(所以 Move-Item 可以成功),但不允许删除或覆盖被重命名后的文件(所以 Remove-Item 和后续的 Move-Item -Force 会失败)。

What steps can reproduce the bug?

  1. 确保 %USERPROFILE%.kimi-code\bin\ 目录下没有 kimi.exe.bak 文件
  2. 打开终端并运行 kimi 启动 TUI
  3. 在另一个 PowerShell 窗口中运行:irm https://code.kimi.com/kimi-code/install.ps1 | iex
  4. 第1次安装成功(创建了 kimi.exe.bak)
  5. 不退出 kimi TUI,再次运行:irm https://code.kimi.com/kimi-code/install.ps1 | iex
  6. 第2次安装失败,报错:当文件已存在时,无法创建该文件。

What is the expected behavior?

安装脚本应该正确处理 kimi.exe 正在运行的情况,即使 kimi.exe.bak 已存在且被锁定,也能完成安装。

Recommended Fix

将第 362-368 行的备份逻辑改为使用带时间戳的备份文件名,避免与被锁定的 .bak 文件冲突:

if (Test-Path $binaryDest) {
    $backup = "$binaryDest.bak"
    if (Test-Path $backup) {
        try {
            Remove-Item $backup -Force -ErrorAction Stop
        } catch {
            # 文件被运行中的进程锁定,使用带时间戳的备份名
            $backup = "$binaryDest.$(Get-Date -Format 'yyyyMMddHHmmss').bak"
        }
    }
    Move-Item $binaryDest $backup -Force
    Write-Step "Backed up existing kimi.exe to $([System.IO.Path]::GetFileName($backup))"
}

修复说明:

  • 保留原有 Remove-Item 尝试,但将 -ErrorAction SilentlyContinue 改为 -ErrorAction Stop
  • 当 Remove-Item 失败(文件被锁定)时,回退到使用带时间戳的备份文件名
  • 确保无论 .bak 是否被锁定,安装都能继续完成

Additional information

  • 当 kimi 进程退出时,锁定会立即释放
  • 第1次安装成功是因为 kimi.exe.bak 不存在,Move-Item 无需覆盖
  • 第2次安装失败是因为第1次留下的 kimi.exe.bak 被运行着的kimi TUI锁定
  • 此问题只在 Windows平台出现;Unix 系统可以覆盖正在运行的二进制文件
  • https://code.kimi.com/kimi-code/0.14.3/manifest.json → 404 #773 issue后续的延伸分析 @liruifengv

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions