找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 446|回复: 0

[系统相关] 【求助】转移系统文件夹批处理出错,求修正。

[复制链接]
发表于 2026-2-11 09:34:08 | 显示全部楼层 |阅读模式
以下代码是 DeepSeek 生成,但是运行一闪而过,不知道哪里出错,求修正,谢谢!
注:由于源代码超 1 万字符,删除日志相关语句。
SetupComplete.cmd
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. REM 功能:搜索非系统盘,优先选择含有 Drivers 和/或 Users 的盘符
  4. REM 并将 ProgramData、Program Files、Program Files (x86) 移动到此盘符

  5. echo [%date% %time%] 开始驱动器迁移...

  6. REM 阶段1:查找符合条件的驱动器
  7. echo [%date% %time%] 阶段1:搜索符合条件的驱动器...

  8. set "BEST_DRIVE="
  9. set "BEST_SCORE=0"

  10. REM 获取所有驱动器列表
  11. for /f "tokens=1,2 delims=:" %%i in ('wmic logicaldisk where "DriveType=3" get caption^,description /value ^| findstr "Caption"') do (
  12.     set "DRIVE=%%j"
  13.    
  14.     REM 跳过系统盘(检查是否有 Windows\explorer.exe)
  15.     if exist "!DRIVE!:\Windows\explorer.exe" (
  16.         goto :NEXT_DRIVE
  17.     )
  18.    
  19.     REM 计算优先级分数
  20.     set "SCORE=0"
  21.     set "REASON="
  22.    
  23.     REM 检查 Drivers 目录 (+30分)
  24.     if exist "!DRIVE!:\Drivers" (
  25.         set /a SCORE+=30
  26.         set "REASON=!REASON! Drivers"
  27.     )
  28.    
  29.     REM 检查 Users 目录 (+30分)
  30.     if exist "!DRIVE!:\Users" (
  31.         set /a SCORE+=60
  32.         set "REASON=!REASON! Users"
  33.     )
  34.    
  35.     REM 检查空间大小(每10GB加1分,最多加20分)
  36.     for /f "tokens=2 delims==" %%f in ('wmic logicaldisk where "caption='!DRIVE!:'" get freespace /value ^| findstr "FreeSpace"') do (
  37.         set "FREE_BYTES=%%f"
  38.     )
  39.    
  40.     if defined FREE_BYTES (
  41.         set /a FREE_GB=FREE_BYTES/1073741824
  42.         set /a SPACE_SCORE=FREE_GB/10
  43.         if !SPACE_SCORE! gtr 20 set SPACE_SCORE=20
  44.         set /a SCORE+=SPACE_SCORE
  45.         set "REASON=!REASON! Space(!FREE_GB!GB)"
  46.     )
  47.    
  48.     REM 如果是SSD (+10分)
  49.     for /f "tokens=*" %%d in ('powershell -Command "Get-WmiObject Win32_DiskDrive | ForEach-Object { $drive = $_; $_.GetRelated('Win32_DiskPartition') | ForEach-Object { $_.GetRelated('Win32_LogicalDisk') | Where-Object {$_.DeviceID -eq '!DRIVE!:'} | ForEach-Object { if ($drive.MediaType -eq 'SSD' -or $drive.MediaType -match 'Fixed.*media') { echo 'SSD' } } } }" 2^>nul') do (
  50.         if "%%d"=="SSD" (
  51.             set /a SCORE+=10
  52.             set "REASON=!REASON! SSD"
  53.         )
  54.     )
  55.    
  56.     REM 选择最高分的驱动器
  57.     if !SCORE! gtr !BEST_SCORE! (
  58.         set "BEST_DRIVE=!DRIVE!"
  59.         set "BEST_SCORE=!SCORE!"
  60.         set "BEST_REASON=!REASON!"
  61.     )
  62.    
  63.     :NEXT_DRIVE
  64. )

  65. REM 检查是否找到合适的驱动器
  66. if not defined BEST_DRIVE (
  67.     echo [%date% %time%] 错误:未找到符合条件的驱动器
  68.     goto :ERROR_EXIT
  69. )

  70. echo [%date% %time%] 选择驱动器: %BEST_DRIVE%: (得分: %BEST_SCORE%)

  71. REM 阶段2:停止相关服务
  72. echo [%date% %time%] 阶段2:停止相关服务...

  73. set "SERVICES_TO_STOP=wuauserv cryptsvc EventLog Schedule Winmgmt ProfSvc"

  74. for %%s in (%SERVICES_TO_STOP%) do (
  75.     net stop %%s /y >nul 2>&1
  76. )

  77. REM 等待服务停止
  78. timeout /t 5 /nobreak >nul

  79. REM 阶段3:移动 ProgramData
  80. echo [%date% %time%] 阶段3:移动 ProgramData...

  81. set "SOURCE_PROGRAMDATA=C:\ProgramData"
  82. set "TARGET_PROGRAMDATA=%BEST_DRIVE%:\ProgramData"

  83. if exist "%SOURCE_PROGRAMDATA%" (

  84.     REM 备份现有目标目录
  85.     if exist "%TARGET_PROGRAMDATA%" (
  86.         set "BACKUP_DIR=%TARGET_PROGRAMDATA%_BACKUP_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
  87.         set "BACKUP_DIR=!BACKUP_DIR: =0!"
  88.         ren "%TARGET_PROGRAMDATA%" "%~nxBACKUP_DIR%" >nul 2>&1
  89.     )
  90.    
  91.     REM 使用 robocopy 复制目录
  92.     robocopy "%SOURCE_PROGRAMDATA%" "%TARGET_PROGRAMDATA%" /E /COPYALL /DCOPY:T /XJ /R:1 /W:1 /NP /TEE
  93.    
  94.     if errorlevel 8 (
  95.         goto :RESTORE_SERVICES
  96.     )
  97.    
  98.     REM 删除源目录并创建交接点
  99.     rmdir /s /q "%SOURCE_PROGRAMDATA%" 2>nul
  100.     mklink /J "%SOURCE_PROGRAMDATA%" "%TARGET_PROGRAMDATA%" >nul
  101.    
  102.     if errorlevel 1 (
  103.         if exist "%TARGET_PROGRAMDATA%" (
  104.             robocopy "%TARGET_PROGRAMDATA%" "%SOURCE_PROGRAMDATA%" /E /COPYALL /R:1 /W:1
  105.     )
  106.     )
  107. )

  108. REM 阶段4:移动 Program Files
  109. echo [%date% %time%] 阶段4:移动 Program Files...

  110. set "SOURCE_PF=C:\Program Files"
  111. set "TARGET_PF=%BEST_DRIVE%:\Program Files"

  112. if exist "%SOURCE_PF%" (
  113.    
  114.     REM 检查是否有程序正在运行
  115.     tasklist /fi "IMAGENAME eq explorer.exe" | findstr /i "explorer.exe" >nul
  116.     if errorlevel 0 (
  117.         goto :MOVE_PFX86
  118.     )
  119.    
  120.     if exist "%TARGET_PF%" (
  121.         set "BACKUP_PF=%TARGET_PF%_BACKUP_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
  122.         set "BACKUP_PF=!BACKUP_PF: =0!"
  123.         ren "%TARGET_PF%" "%~nxBACKUP_PF%" >nul 2>&1
  124.     )
  125.    
  126.     robocopy "%SOURCE_PF%" "%TARGET_PF%" /E /COPYALL /DCOPY:T /XJ /R:1 /W:1 /NP /TEE
  127.    
  128.     if not errorlevel 8 (
  129.         REM 为已安装的程序创建交接点
  130.         rmdir /s /q "%SOURCE_PF%" 2>nul
  131.         mklink /J "%SOURCE_PF%" "%TARGET_PF%" >nul
  132.         
  133.         if errorlevel 1 (
  134.             REM 恢复复制
  135.             if exist "%TARGET_PF%" (
  136.                 robocopy "%TARGET_PF%" "%SOURCE_PF%" /E /COPYALL /R:1 /W:1
  137.             )
  138.         )
  139.     )
  140. )

  141. :MOVE_PFX86
  142. REM 阶段5:移动 Program Files (x86)
  143. echo [%date% %time%] 阶段5:移动 Program Files (x86)...

  144. set "SOURCE_PFX86=C:\Program Files (x86)"
  145. set "TARGET_PFX86=%BEST_DRIVE%:\Program Files (x86)"

  146. REM 检查是否是64位系统
  147. if exist "%SOURCE_PFX86%" (
  148.    
  149.     if exist "%TARGET_PFX86%" (
  150.         set "BACKUP_PFX86=%TARGET_PFX86%_BACKUP_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
  151.         set "BACKUP_PFX86=!BACKUP_PFX86: =0!"
  152.         ren "%TARGET_PFX86%" "%~nxBACKUP_PFX86%" >nul 2>&1
  153.     )
  154.    
  155.     robocopy "%SOURCE_PFX86%" "%TARGET_PFX86%" /E /COPYALL /DCOPY:T /XJ /R:1 /W:1 /NP /TEE
  156.    
  157.     if not errorlevel 8 (
  158.         REM 创建交接点
  159.         rmdir /s /q "%SOURCE_PFX86%" 2>nul
  160.         mklink /J "%SOURCE_PFX86%" "%TARGET_PFX86%" >nul
  161.         
  162.         if errorlevel 1 (
  163.             if exist "%TARGET_PFX86%" (
  164.                 robocopy "%TARGET_PFX86%" "%SOURCE_PFX86%" /E /COPYALL /R:1 /W:1
  165.             )
  166.         )
  167.     )
  168. )

  169. REM 阶段6:更新注册表和环境变量
  170. echo [%date% %time%] 阶段6:更新系统设置...

  171. REM 更新 ProgramData 环境变量
  172. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "ProgramData" /t REG_EXPAND_SZ /d "%TARGET_PROGRAMDATA%" /f >nul

  173. REM 更新 ProgramFiles 环境变量
  174. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "ProgramFiles" /t REG_EXPAND_SZ /d "%TARGET_PF%" /f >nul

  175. REM 如果是64位系统,更新 ProgramFiles(x86)
  176. if exist "%SOURCE_PFX86%" (
  177.     reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "ProgramFiles(x86)" /t REG_EXPAND_SZ /d "%TARGET_PFX86%" /f >nul
  178. )

  179. REM 更新 CommonProgramFiles
  180. set "COMMON_PF=%TARGET_PF%\Common Files"
  181. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "CommonProgramFiles" /t REG_EXPAND_SZ /d "%COMMON_PF%" /f >nul

  182. if exist "%SOURCE_PFX86%" (
  183.     set "COMMON_PFX86=%TARGET_PFX86%\Common Files"
  184.     reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "CommonProgramFiles(x86)" /t REG_EXPAND_SZ /d "%COMMON_PFX86%" /f >nul
  185. )

  186. REM 阶段7:重新启动服务
  187. :RESTORE_SERVICES
  188. echo [%date% %time%] 阶段7:重新启动服务...

  189. for %%s in (%SERVICES_TO_STOP%) do (
  190.     net start %%s >nul 2>&1
  191. )

  192. REM 阶段8:创建验证标记
  193. echo [%date% %time%] 阶段8:创建验证标记...

  194. echo Migration completed on %date% %time% > "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
  195. echo Source Drive: C: >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
  196. echo Target Drive: %BEST_DRIVE%: >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
  197. echo ProgramData: %TARGET_PROGRAMDATA% >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
  198. echo Program Files: %TARGET_PF% >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
  199. if exist "%SOURCE_PFX86%" echo Program Files (x86): %TARGET_PFX86% >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"

  200. REM 阶段9:完成
  201. echo [%date% %time%] 驱动器迁移完成!

  202. echo 迁移摘要:
  203. echo 目标驱动器:%BEST_DRIVE%: (得分:%BEST_SCORE%)
  204. echo 原因:%BEST_REASON%
  205. echo ProgramData:%TARGET_PROGRAMDATA%
  206. echo Program Files:%TARGET_PF%
  207. if exist "%SOURCE_PFX86%" echo Program Files (x86): %TARGET_PFX86%

  208. echo 按任意键继续...
  209. pause >nul

  210. endlocal
  211. goto :EOF

  212. :ERROR_EXIT
  213. echo [%date% %time%] 错误:迁移失败,未找到合适的驱动器
  214. endlocal
  215. exit /b 1
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:03 , Processed in 0.010054 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表