写了个文件夹无损迁移脚本搞定 C 盘爆满

C 盘又红了?软件缓存(如 .cursor、.vscode、Docker 虚拟盘)越堆越大,直接剪切移动又怕软件打不开?

分享一个让ai写的 Windows 文件夹安全重定向脚本,基于 robocopy + mklink 软链接机制,支持安全检测、增量迁移与断点续传!

使用提示:新建文本文件,粘贴以下代码,将 %OLD_PATH% 和 %NEW_PATH% 改为你自己的路径,保存时编码选择 ANSI(防止乱码),最后右键以管理员身份运行,记得把占用文件关闭。

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: ============================================================
:: 配置区:请在此修改您要迁移的文件夹路径
:: ============================================================
set "OLD_PATH=C:旧地址"
set "NEW_PATH=D:新地址"
:: ============================================================

echo ============================================================
echo      通用文件夹重定向工具 (增量迁移/断点续传版)
echo ============================================================

:: 1. 管理员权限检查
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo [提示] 正在请求管理员权限...
    powershell start-process "%~f0" -verb runas
    exit /b
)

:: 2. 核心确认逻辑
echo.
echo 请核对以下迁移信息:
echo ------------------------------------------------------------
echo  [旧路径(源)]: %OLD_PATH%
echo  [新路径(目的)]: %NEW_PATH%
echo ------------------------------------------------------------
echo.
set /p "user_confirm=确认无误请按 Y,按其他任意键取消并退出: "

if /i "%user_confirm%" neq "Y" (
    echo.
    echo [取消] 操作已由用户取消。
    pause
    exit /b
)

:: 3. 预检查:源路径是否存在
if not exist "%OLD_PATH%" (
    echo [错误] 找不到源文件夹,请检查路径是否正确。
    pause & exit /b
)

:: 4. 目标路径状态检测
if exist "%NEW_PATH%" (
    echo.
    echo [提示] 目标文件夹已存在,将启用【增量迁移模式】。
    echo [提示] 仅移动源文件夹中缺失或更新的文件,已存在的文件将跳过。
)

:: 5. 占用检查
echo.
echo [状态] 正在检查文件夹是否被程序占用...

for %%I in ("%OLD_PATH%") do (
    set "PARENT_DIR=%%~dpI"
    set "FOLDER_NAME=%%~nxI"
)

set "TEST_TMP_NAME=!FOLDER_NAME!_test_tmp"

ren "%OLD_PATH%" "!TEST_TMP_NAME!" 2>nul
if %errorLevel% neq 0 (
    echo.
    echo [拒绝] 文件夹正在被使用(或已被锁死),无法移动!
    echo [建议] 请关闭相关软件(如 Cursor、VS Code 等后台进程)后再试。
    pause & exit /b
) else (
    ren "!PARENT_DIR!!TEST_TMP_NAME!" "!FOLDER_NAME!" 2>nul
)

:: 6. 开始增量搬家与清洗源文件夹
echo.
echo [执行] 正在增量迁移数据并清洗源目录,请稍候...

:: /E: 递归复制(包含空目录)
:: /MOVE: 复制成功后删除源文件及源目录
:: /XC /XN /XO: 补充匹配规则(确保只覆盖变动/新增的数据)
robocopy "%OLD_PATH%" "%NEW_PATH%" /E /MOVE /NJH /NJS /R:3 /W:1 /MT:16 /NP

if %errorLevel% geq 8 (
    echo.
    echo [错误] 数据迁移失败,Robocopy 退出代码: %errorLevel%
    echo [提示] 软链接未创建,请检查权限或文件占用。
    pause & exit /b
)

:: 如果源文件夹中还留有未删干净的空文件夹(Robocopy 有时会留下源根目录),强制清理源空目录
if exist "%OLD_PATH%" (
    rmdir /s /q "%OLD_PATH%" 2>nul
)

:: 如果源文件夹依然存在(说明里面仍有文件未被成功删除),说明清理不干净,无法创建软链接
if exist "%OLD_PATH%" (
    echo.
    echo [错误] 源文件夹无法完全删除,可能存在被占用的残留文件。
    echo [提示] 请关闭占用程序后重新运行本脚本。
    pause & exit /b
)

:: 7. 创建软链接
echo [执行] 正在创建软链接...
mklink /J "%OLD_PATH%" "%NEW_PATH%"

if %errorLevel% equ 0 (
    echo.
    echo ============================================================
    echo [成功] 增量迁移及软链接创建完成!
    echo [结果] %OLD_PATH% --^> %NEW_PATH%
    echo ============================================================
) else (
    echo.
    echo [失败] 软链接创建失败!
)

pause
24 个赞

非常不错,已经收藏了。谢谢佬友分享

4 个赞

感谢分享 收藏一波 希望后面不会用上

3 个赞

感谢佬分享,很不错。。已经收藏了。。

1 个赞

感谢佬的分享,防止后续要用找不到,插个眼

2 个赞

感谢分享,我的C盘已经快顶不住了,应该马上能用到了

1 个赞

收个藏插个眼,感谢佬的分享,以免后续要用找不到 :+1:

1 个赞

插个眼,后续也许可能会用到。谢谢佬友分享

1 个赞

插眼,后续可能会用到,感谢佬:folded_hands:t2:

1 个赞