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

[注册表类] 求一个无感更改Windows默认文件夹的批处理,求无感更改

[复制链接]
发表于 2026-2-1 19:01:22 | 显示全部楼层 |阅读模式


求个window 10/11 的默认文件夹“无感”改成其他盘符的批处理,不结束explorer.exe,
例子:
  1. @echo off
  2. chcp 65001 >nul
  3. setlocal
  4. set "DESKTOP_PATH=Z:\dev\syswjj\Desktop"

  5. :: 自动管理员提权
  6. fltmc >nul 2>&1 || (powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs" >nul 2>&1 & exit /b)

  7. :: 1. 确保路径存在
  8. if not exist "%DESKTOP_PATH%" mkdir "%DESKTOP_PATH%" >nul 2>&1

  9. :: 2. 写入注册表(确保所有路径一致)
  10. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop /t REG_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
  11. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
  12. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v {754AC886-DF64-4CBA-86B5-F7FBF4FBCEF5} /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1

  13. :: 3. 最小感知重启 explorer(先开新、后杀旧,闪屏最短)
  14. :: 先启动新 explorer(后台)
  15. start explorer.exe
  16. :: 极短等待,让新进程先起来
  17. timeout /t 1 /nobreak >nul
  18. :: 再杀掉旧 explorer(此时桌面已经在重建,闪屏极短)
  19. taskkill /f /im explorer.exe >nul 2>&1
  20. :: 再次启动 explorer(确保完全恢复)
  21. start explorer.exe

  22. endlocal
  23. exit /b 0
复制代码
这个批处理做不到无感改,运行后有闪屏,手动直接剪切过去倒是无感,但是现在需要批处理来实现

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2026-2-1 20:10:37 | 显示全部楼层
不结束explorer.exe怎么做到设置立即生效?
 楼主| 发表于 2026-2-1 20:31:28 | 显示全部楼层
回复 2# semiuel


    属性里面手动改就是直接生效,或者直接剪切也是即时生效的。
发表于 2026-2-2 10:43:15 | 显示全部楼层
回复 1# qq1258077776
  1. RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters
复制代码
或者
  1. powershell -command "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('{F5}')"
复制代码
试过吗?
 楼主| 发表于 2026-2-2 20:05:52 | 显示全部楼层
回复 4# holley


    刚试了一下不行,是我改注册表项少了么?
 楼主| 发表于 2026-2-2 20:53:10 | 显示全部楼层
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

:: ===================== 配置 =====================
set "DESKTOP_PATH=C:\desk"
set "DESKTOP_Folder=desk"
:: ================================================

:: 管理员检查
fltmc >nul 2>&1 || (powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs" >nul 2>&1 & exit /b)

:: 1. 确保路径存在
if not exist "%DESKTOP_PATH%" mkdir "%DESKTOP_PATH%" >nul 2>&1

:: 2. 写死注册表(所有相关项全部对齐)
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop /t REG_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v {754AC886-DF64-4CBA-86B5-F7FBF4FBCEF5} /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
reg add "HKEY_USERS\S-1-5-21-2102424839-3844022025-2526979904-1001\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v {754AC886-DF64-4CBA-86B5-F7FBF4FBCEF5} /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
reg add "HKEY_USERS\S-1-5-21-2102424839-3844022025-2526979904-1001\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1

:: 手动添加的
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop /t REG_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
reg add "HKEY_USERS\S-1-5-21-2102424839-3844022025-2526979904-1001\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop /t REG_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1

:: 手动添加的--"%DESKTOP_PATH%"这里的值实际是%USERPROFILE%\Desktop 或 %SystemDrive%\abc4891
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v {754AC886-DF64-4CBA-86B5-F7FBF4FBCEF5} /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop /t REG_EXPAND_SZ /d "%DESKTOP_PATH%" /f >nul 2>&1


:: 3. 清理缓存(不影响显示
del /f /q "%LOCALAPPDATA%\Microsoft\Windows\Explorer\IconCache*.db" >nul 2>&1
del /f /q "%LOCALAPPDATA%\Microsoft\Windows\Explorer\*.tmp" >nul 2>&1
del /f /q "%LOCALAPPDATA%\Microsoft\Windows\Explorer\DesktopFolder.dat" >nul 2>&1

:: 4. 强制刷新 Shell 环境(关键)
:: 这是 Windows 官方“让 User Shell Folders 立即生效”的标准广播
rundll32 user32.dll,UpdatePerUserSystemParameters 1,True >nul 2>&1

:: 5. 强制刷新桌面文件夹(不闪屏、不重绘整个桌面)
:: 只刷新桌面文件夹本身,不是重启 explorer
powershell -WindowStyle Hidden -Command "$shell=New-Object -ComObject Shell.Application;$desk=$shell.NameSpace(0x0000);$desk.Self.Path='%DESKTOP_PATH%';[System.Runtime.Interopservices.Marshal]::ReleaseComObject($desk)|Out-Null;[System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell)|Out-Null;" >nul 2>&1

:: 6. 最后再发一次最小刷新通知
powershell -WindowStyle Hidden -Command "$sig=@'
[DllImport(\"shell32.dll\")] public static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
'@;$w=Add-Type -MemberDefinition $sig -Name Win32 -Namespace Shell -PassThru;$w::SHChangeNotify(0x00001000, 0x0005, '%DESKTOP_PATH%', [IntPtr]::Zero);" >nul 2>&1

:: 7. https://bbs.bathome.net/thread-75784-1-1.html
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters

:: 8. https://bbs.bathome.net/thread-75784-1-1.html
powershell -command "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('{F5}')"

:: 9. https://bbs.bathome.net/thread-75784-1-1.html

endlocal
exit /b 0

这个也不行必须要重开explorer.exe
发表于 2026-2-3 13:15:38 | 显示全部楼层
以下代码保存为test.bat执行。其中powershell代码由gemini ai提供。
  1. <#*,:
  2. @echo off
  3. cd /d "%~dp0"
  4. set "batchfile=%~f0"
  5. Powershell -ExecutionPolicy Bypass -C "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create([IO.File]::ReadAllText($env:batchfile,[Text.Encoding]::GetEncoding(0) )) )"
  6. pause
  7. exit /b
  8. #>

  9. # 1. 配置你的新根目录
  10. $BaseDir = "D:\MyFiles"

  11. # 2. 文件夹及其对应的官方 GUID
  12. $FolderMap = @{
  13.     #"Downloads" = "374DE290-123F-4565-9164-39C4925E467B"
  14.     #"Documents" = "FDD39AD0-238F-46AF-ADB4-6C85480369C7"
  15.     "Desktop"   = "B4BFCC3A-DB2C-424C-B029-7FE99A87C641"
  16.     #"Pictures"  = "33E28130-4E1E-4676-835A-98395C3BC3BB"
  17.     #"Music"     = "4BD8C516-2D47-496B-A4A2-054C1D1DDB01"
  18.     #"Videos"    = "18989B1D-99B5-455B-841C-AB7C74E4DDFC"
  19. }

  20. # 3. 嵌入底层 C# 代码防止闪退
  21. $CSource = @"
  22. using System;
  23. using System.Runtime.InteropServices;

  24. public class ShellManager {
  25.     [DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
  26.     public static extern void SHSetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, string pszPath);
  27.    
  28.     [DllImport("shell32.dll")]
  29.     public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
  30. }
  31. "@

  32. if (!([System.Management.Automation.PSTypeName]'ShellManager').Type) {
  33.     Add-Type -TypeDefinition $CSource
  34. }

  35. # 4. 执行循环修改
  36. foreach ($Name in $FolderMap.Keys) {
  37.     $Target = Join-Path $BaseDir $Name
  38.     if (!(Test-Path $Target)) { New-Item $Target -ItemType Directory -Force | Out-Null }
  39.    
  40.     try {
  41.         $Guid = [Guid]$FolderMap[$Name]
  42.         # 参数 0 代表立即生效并通知系统
  43.         [ShellManager]::SHSetKnownFolderPath($Guid, 0, [IntPtr]::Zero, $Target)
  44.         Write-Host "[成功] $Name 已定向至 $Target" -ForegroundColor Green
  45.     } catch {
  46.         Write-Host "[失败] $Name 无法修改,可能被 OneDrive 占用" -ForegroundColor Red
  47.     }
  48. }

  49. # 5. 强制触发全局 UI 刷新 (SHCNE_ASSOCCHANGED)
  50. [ShellManager]::SHChangeNotify(0x08000000, 0x0000, [IntPtr]::Zero, [IntPtr]::Zero)

  51. Write-Host "`n操作完成!如果侧边栏图标没变,请点一下它,它会自动跳转到新位置。" -ForegroundColor Cyan
复制代码

评分

参与人数 1技术 +1 收起 理由
qq1258077776 + 1 nb

查看全部评分

发表于 2026-2-3 14:42:32 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-2-3 14:59 编辑

回复 6# qq1258077776

所谓 '无感更改' 就是不用重启 explorer,但如果必须重启 explorer 才能生效,不如采用最简洁的批处脚本一气呵成(克隆原址数据到新址+注册表键值修改+exploer重启),如下示例

  1. @echo off &setlocal &set "src=%userprofile%\Desktop" &set "new=d:\Desktop"
  2. robocopy "%src%" "%new%" /mir >nul
  3. reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop /t REG_EXPAND_SZ /d "%new%" /f
  4. :: reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Desktop /t REG_EXPAND_SZ /d "%new%" /f
  5. taskkill /f /im explorer.exe >nul & start explorer.exe &exit/b
复制代码
注册表用两个键值记录当前桌面存储位置,修改 User Shell Folders 路径下的 desktop 应会自动更正 Shell Folders 路径下的 desktop,若发现因系统版本差别等原因未果,可将代码中第4行前缀注释符去除...
 楼主| 发表于 2026-2-4 13:36:05 | 显示全部楼层
回复 7# 77七


    这个确实可行,感谢,豆包还是不行啊,这个问题问豆包都给豆包弄蒙了都不好使。
 楼主| 发表于 2026-2-4 13:37:01 | 显示全部楼层
回复 8# aloha20200628


    上面那大哥的测试可行。无感,就是跟刷新一下一样,BAT编码注意一下,要不不好使。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 06:59 , Processed in 0.025594 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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