|
|
以下代码是 DeepSeek 生成,但是运行一闪而过,不知道哪里出错,求修正,谢谢!
注:由于源代码超 1 万字符,删除日志相关语句。
SetupComplete.cmd- @echo off
- setlocal enabledelayedexpansion
- REM 功能:搜索非系统盘,优先选择含有 Drivers 和/或 Users 的盘符
- REM 并将 ProgramData、Program Files、Program Files (x86) 移动到此盘符
- echo [%date% %time%] 开始驱动器迁移...
- REM 阶段1:查找符合条件的驱动器
- echo [%date% %time%] 阶段1:搜索符合条件的驱动器...
- set "BEST_DRIVE="
- set "BEST_SCORE=0"
- REM 获取所有驱动器列表
- for /f "tokens=1,2 delims=:" %%i in ('wmic logicaldisk where "DriveType=3" get caption^,description /value ^| findstr "Caption"') do (
- set "DRIVE=%%j"
-
- REM 跳过系统盘(检查是否有 Windows\explorer.exe)
- if exist "!DRIVE!:\Windows\explorer.exe" (
- goto :NEXT_DRIVE
- )
-
- REM 计算优先级分数
- set "SCORE=0"
- set "REASON="
-
- REM 检查 Drivers 目录 (+30分)
- if exist "!DRIVE!:\Drivers" (
- set /a SCORE+=30
- set "REASON=!REASON! Drivers"
- )
-
- REM 检查 Users 目录 (+30分)
- if exist "!DRIVE!:\Users" (
- set /a SCORE+=60
- set "REASON=!REASON! Users"
- )
-
- REM 检查空间大小(每10GB加1分,最多加20分)
- for /f "tokens=2 delims==" %%f in ('wmic logicaldisk where "caption='!DRIVE!:'" get freespace /value ^| findstr "FreeSpace"') do (
- set "FREE_BYTES=%%f"
- )
-
- if defined FREE_BYTES (
- set /a FREE_GB=FREE_BYTES/1073741824
- set /a SPACE_SCORE=FREE_GB/10
- if !SPACE_SCORE! gtr 20 set SPACE_SCORE=20
- set /a SCORE+=SPACE_SCORE
- set "REASON=!REASON! Space(!FREE_GB!GB)"
- )
-
- REM 如果是SSD (+10分)
- 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 (
- if "%%d"=="SSD" (
- set /a SCORE+=10
- set "REASON=!REASON! SSD"
- )
- )
-
- REM 选择最高分的驱动器
- if !SCORE! gtr !BEST_SCORE! (
- set "BEST_DRIVE=!DRIVE!"
- set "BEST_SCORE=!SCORE!"
- set "BEST_REASON=!REASON!"
- )
-
- :NEXT_DRIVE
- )
- REM 检查是否找到合适的驱动器
- if not defined BEST_DRIVE (
- echo [%date% %time%] 错误:未找到符合条件的驱动器
- goto :ERROR_EXIT
- )
- echo [%date% %time%] 选择驱动器: %BEST_DRIVE%: (得分: %BEST_SCORE%)
- REM 阶段2:停止相关服务
- echo [%date% %time%] 阶段2:停止相关服务...
- set "SERVICES_TO_STOP=wuauserv cryptsvc EventLog Schedule Winmgmt ProfSvc"
- for %%s in (%SERVICES_TO_STOP%) do (
- net stop %%s /y >nul 2>&1
- )
- REM 等待服务停止
- timeout /t 5 /nobreak >nul
- REM 阶段3:移动 ProgramData
- echo [%date% %time%] 阶段3:移动 ProgramData...
- set "SOURCE_PROGRAMDATA=C:\ProgramData"
- set "TARGET_PROGRAMDATA=%BEST_DRIVE%:\ProgramData"
- if exist "%SOURCE_PROGRAMDATA%" (
- REM 备份现有目标目录
- if exist "%TARGET_PROGRAMDATA%" (
- set "BACKUP_DIR=%TARGET_PROGRAMDATA%_BACKUP_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
- set "BACKUP_DIR=!BACKUP_DIR: =0!"
- ren "%TARGET_PROGRAMDATA%" "%~nxBACKUP_DIR%" >nul 2>&1
- )
-
- REM 使用 robocopy 复制目录
- robocopy "%SOURCE_PROGRAMDATA%" "%TARGET_PROGRAMDATA%" /E /COPYALL /DCOPY:T /XJ /R:1 /W:1 /NP /TEE
-
- if errorlevel 8 (
- goto :RESTORE_SERVICES
- )
-
- REM 删除源目录并创建交接点
- rmdir /s /q "%SOURCE_PROGRAMDATA%" 2>nul
- mklink /J "%SOURCE_PROGRAMDATA%" "%TARGET_PROGRAMDATA%" >nul
-
- if errorlevel 1 (
- if exist "%TARGET_PROGRAMDATA%" (
- robocopy "%TARGET_PROGRAMDATA%" "%SOURCE_PROGRAMDATA%" /E /COPYALL /R:1 /W:1
- )
- )
- )
- REM 阶段4:移动 Program Files
- echo [%date% %time%] 阶段4:移动 Program Files...
- set "SOURCE_PF=C:\Program Files"
- set "TARGET_PF=%BEST_DRIVE%:\Program Files"
- if exist "%SOURCE_PF%" (
-
- REM 检查是否有程序正在运行
- tasklist /fi "IMAGENAME eq explorer.exe" | findstr /i "explorer.exe" >nul
- if errorlevel 0 (
- goto :MOVE_PFX86
- )
-
- if exist "%TARGET_PF%" (
- set "BACKUP_PF=%TARGET_PF%_BACKUP_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
- set "BACKUP_PF=!BACKUP_PF: =0!"
- ren "%TARGET_PF%" "%~nxBACKUP_PF%" >nul 2>&1
- )
-
- robocopy "%SOURCE_PF%" "%TARGET_PF%" /E /COPYALL /DCOPY:T /XJ /R:1 /W:1 /NP /TEE
-
- if not errorlevel 8 (
- REM 为已安装的程序创建交接点
- rmdir /s /q "%SOURCE_PF%" 2>nul
- mklink /J "%SOURCE_PF%" "%TARGET_PF%" >nul
-
- if errorlevel 1 (
- REM 恢复复制
- if exist "%TARGET_PF%" (
- robocopy "%TARGET_PF%" "%SOURCE_PF%" /E /COPYALL /R:1 /W:1
- )
- )
- )
- )
- :MOVE_PFX86
- REM 阶段5:移动 Program Files (x86)
- echo [%date% %time%] 阶段5:移动 Program Files (x86)...
- set "SOURCE_PFX86=C:\Program Files (x86)"
- set "TARGET_PFX86=%BEST_DRIVE%:\Program Files (x86)"
- REM 检查是否是64位系统
- if exist "%SOURCE_PFX86%" (
-
- if exist "%TARGET_PFX86%" (
- set "BACKUP_PFX86=%TARGET_PFX86%_BACKUP_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
- set "BACKUP_PFX86=!BACKUP_PFX86: =0!"
- ren "%TARGET_PFX86%" "%~nxBACKUP_PFX86%" >nul 2>&1
- )
-
- robocopy "%SOURCE_PFX86%" "%TARGET_PFX86%" /E /COPYALL /DCOPY:T /XJ /R:1 /W:1 /NP /TEE
-
- if not errorlevel 8 (
- REM 创建交接点
- rmdir /s /q "%SOURCE_PFX86%" 2>nul
- mklink /J "%SOURCE_PFX86%" "%TARGET_PFX86%" >nul
-
- if errorlevel 1 (
- if exist "%TARGET_PFX86%" (
- robocopy "%TARGET_PFX86%" "%SOURCE_PFX86%" /E /COPYALL /R:1 /W:1
- )
- )
- )
- )
- REM 阶段6:更新注册表和环境变量
- echo [%date% %time%] 阶段6:更新系统设置...
- REM 更新 ProgramData 环境变量
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "ProgramData" /t REG_EXPAND_SZ /d "%TARGET_PROGRAMDATA%" /f >nul
- REM 更新 ProgramFiles 环境变量
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "ProgramFiles" /t REG_EXPAND_SZ /d "%TARGET_PF%" /f >nul
- REM 如果是64位系统,更新 ProgramFiles(x86)
- if exist "%SOURCE_PFX86%" (
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "ProgramFiles(x86)" /t REG_EXPAND_SZ /d "%TARGET_PFX86%" /f >nul
- )
- REM 更新 CommonProgramFiles
- set "COMMON_PF=%TARGET_PF%\Common Files"
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "CommonProgramFiles" /t REG_EXPAND_SZ /d "%COMMON_PF%" /f >nul
- if exist "%SOURCE_PFX86%" (
- set "COMMON_PFX86=%TARGET_PFX86%\Common Files"
- reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "CommonProgramFiles(x86)" /t REG_EXPAND_SZ /d "%COMMON_PFX86%" /f >nul
- )
- REM 阶段7:重新启动服务
- :RESTORE_SERVICES
- echo [%date% %time%] 阶段7:重新启动服务...
- for %%s in (%SERVICES_TO_STOP%) do (
- net start %%s >nul 2>&1
- )
- REM 阶段8:创建验证标记
- echo [%date% %time%] 阶段8:创建验证标记...
- echo Migration completed on %date% %time% > "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
- echo Source Drive: C: >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
- echo Target Drive: %BEST_DRIVE%: >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
- echo ProgramData: %TARGET_PROGRAMDATA% >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
- echo Program Files: %TARGET_PF% >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
- if exist "%SOURCE_PFX86%" echo Program Files (x86): %TARGET_PFX86% >> "%BEST_DRIVE%:\DRIVE_MIGRATION_SUCCESS.txt"
- REM 阶段9:完成
- echo [%date% %time%] 驱动器迁移完成!
- echo 迁移摘要:
- echo 目标驱动器:%BEST_DRIVE%: (得分:%BEST_SCORE%)
- echo 原因:%BEST_REASON%
- echo ProgramData:%TARGET_PROGRAMDATA%
- echo Program Files:%TARGET_PF%
- if exist "%SOURCE_PFX86%" echo Program Files (x86): %TARGET_PFX86%
- echo 按任意键继续...
- pause >nul
- endlocal
- goto :EOF
- :ERROR_EXIT
- echo [%date% %time%] 错误:迁移失败,未找到合适的驱动器
- endlocal
- exit /b 1
复制代码 |
|