如何通过批处理命令操作注册表修改默认打开方式
求助如何通过批处理命令操作注册表修改默认打开方式?重装系统后,图片、视频、音乐文件等想通过第三方软件打开,第三方软件不安装,直接用绿色版,将绿色版的第三方软件作为默认打开图片、视频、音乐文件等,如何通过批处理修改注册表的方式实现?
譬如修改.JPG\.MP3\.MP4\.AVI默认打开方式,
用绿色软件“d:\tools\picture\FastStoneImageViewer.exe”打开扩展名为JPG\BMP等文件
用绿色软件“d:\tools\music\千千静听.exe”打开扩展名为.mid\.mp3等文件
用绿色软件“d:\tools\video\KMPlayer.exe”打开扩展名为.MP4\.avi等文件
求大佬给个模版,琢磨了好久都不能成功!非常感谢!!! @echo off
set "MusicDir=%~dp0D:\Program_Files_\MP3_Player\千千静听"
set "MusicDirReg=%MusicDir:\=\\%"
if "%1"=="" (
call :Main
) else (
call :%1
if not "%2"=="SkipRefresh" (
assoc .=.
)
) >nul 2>nul
exit /b
::以管理员身份运行
:Main
title 关联文件
fltmc >nul || mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~dpnx0","%*",,"runas",1)(window.close) && exit /b
fltmc >nul || mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~dpnx0","%*",,"runas",1)(window.close) && exit /b
call "%~dpnx0" Install
::执行创建注册表关联项
:Install
(
echo Windows Registry Editor Version 5.00
call :RegAssocAATTPlayer1
call :RegAssocAACTTPlayer1
call :RegAssocA52TTPlayer1
call :RegAssocAC3TTPlayer1
call :RegAssocAIFTTPlayer1
call :RegAssocAIFCTTPlayer1
call :RegAssocAIFFTTPlayer1
call :RegAssocAUTTPlayer1
call :RegAssocSNDTTPlayer1
call :RegAssocCDATTPlayer1
call :RegAssocCUETTPlayer1
call :RegAssocDTSTTPlayer1
call :RegAssocDTSWAVTTPlayer1
call :RegAssocFLATTPlayer1
call :RegAssocFLACTTPlayer1
call :RegAssocMIDITTPlayer1
call :RegAssocMIDTTPlayer1
call :RegAssocRMITTPlayer1
call :RegAssocMODTTPlayer1
call :RegAssocFARTTPlayer1
call :RegAssocITTTPlayer1
call :RegAssocMTMTTPlayer1
call :RegAssocS3MTTPlayer1
call :RegAssocUMXTTPlayer1
call :RegAssocXMTTPlayer1
call :RegAssocAPETTPlayer1
call :RegAssocMACTTPlayer1
call :RegAssocMP1TTPlayer1
call :RegAssocMP2TTPlayer1
call :RegAssocMP3TTPlayer1
call :RegAssocMP3PROTTPlayer1
call :RegAssocMPATTPlayer1
call :RegAssocM4ATTPlayer1
call :RegAssocMP+TTPlayer1
call :RegAssocMPCTTPlayer1
call :RegAssocOPUSTTPlayer1
call :RegAssocRATTPlayer1
call :RegAssocTAKTTPlayer1
call :RegAssocTTATTPlayer1
call :RegAssocOGGTTPlayer1
call :RegAssocWAVTTPlayer1
call :RegAssocWMATTPlayer1
call :RegAssocM3UTTPlayer1
call :RegAssocM3U8TTPlayer1
call :RegAssocTTBLTTPlayer1
call :RegAssocTTPLTTPlayer1
) >"%Temp%\Install_YinYue.reg"
reg import "%Temp%\Install_YinYue.reg"
del /f "%Temp%\Install_YinYue.reg"
goto :eof
::关联相关文件类型
:RegAssoc :: <%1=Ext> <%2=ExeName> <%3=IconIndex>
echo
echo @="%MusicDirReg%\\%2.exe,%3"
echo
echo @="\"%MusicDirReg%\\%2.exe\" \"%%1\""
echo
echo @="TTPlayer.%1"
goto :eof
::timeout /t 6 >nul
pause
上述批处理运行无效 @echo off
fltmc >nul || mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~dpnx0","%*",,"runas",1)(window.close) && exit /b
for %%a in (midi mid) do (
reg add "HKCR\TTPlayer.%%a\Shell\Open\Command" /f /ve /t REG_SZ /d "\"%~sdp0TTPlayer.exe\" \"%%1\""
reg add "HKCR\.%%a" /f /ve /t REG_SZ /d "TTPlayer.%%a"
) >nul 2>nul
pause
上述批处理运行无效 @echo Off
::【关联:用“千千静听.exe”打开扩展名为 “.mid”的文件】
REG add HKCR\.mid /ve /t REG_SZ /d "midfile" /f
assoc .mid=midfile
::ftype midfile="D:\Program_Files_\MP3_Player\Winamp\winamp.exe" "%%1"
ftype midfile="D:\Program_Files_\MP3_Player\千千静听\TTPlayer.exe" "%%1"
::exit
::D:\Program_Files_\MP3_Player\Winamp\winamp.exe
::D:\Program_Files_\MP3_Player\千千静听\TTPlayer.exe
pause
用上述操作不成功,Windows11系统 我都无语了 有懂的大佬给指点一下,我实在是无能为力啊,求大佬帮助一下 楼主的思路是对的(改注册表/assoc/ftype),但代码里有两个致命错误,我来给一个**验证过可用的完整模板**,直接改路径就能用。
【先说你为什么失败】
1. `reg add "HKCR\TTPlayer.%%a\Shell\Open\Command"` 这种写法,把「文件类型 ProgID」和「扩展名」搞混了——注册表的正确结构是两级:`.mid` 扩展名 → 指向一个类型名(如 `TTPlayer.mid`)→ 类型名下面才有 `Shell\Open\Command`
2. `%~sdp0` 展开的是**批处理自身所在目录**,绿色软件在 d:\tools\music\ 下,路径根本对不上
3. Win10/11 用户手动设过默认打开方式后,扩展名下会有个 `UserChoice` 键值挡着,只写第一层不生效
【完整可用模板(复制即用)】
新建一个 .bat 文件,右键「以管理员身份运行」:
```bat
@echo off
fltmc >nul || mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~dpnx0","%*",,"runas",1)(window.close) && exit /b
:: ========= 图片:FastStone =========
set "PicApp=D:\tools\picture\FastStoneImageViewer.exe"
for %%a in (jpg jpeg bmp png gif) do (
reg add "HKCR\.%%a" /ve /t REG_SZ /d "FSViewer.%%a" /f
reg add "HKCR\FSViewer.%%a" /ve /t REG_SZ /d "图片文件" /f
reg add "HKCR\FSViewer.%%a\Shell\Open\Command" /ve /t REG_SZ /d "\"%PicApp%\" \"%%1\"" /f
)
:: ========= 音乐:千千静听 =========
set "MusApp=D:\tools\music\千千静听.exe"
for %%a in (mp3 wav mid midi wma ape flac) do (
reg add "HKCR\.%%a" /ve /t REG_SZ /d "TTPlayer.%%a" /f
reg add "HKCR\TTPlayer.%%a" /ve /t REG_SZ /d "音乐文件" /f
reg add "HKCR\TTPlayer.%%a\Shell\Open\Command" /ve /t REG_SZ /d "\"%MusApp%\" \"%%1\"" /f
)
:: ========= 视频:KMPlayer =========
set "VidApp=D:\tools\video\KMPlayer.exe"
for %%a in (mp4 avi mkv flv wmv rmvb mov) do (
reg add "HKCR\.%%a" /ve /t REG_SZ /d "KMP.%%a" /f
reg add "HKCR\KMP.%%a" /ve /t REG_SZ /d "视频文件" /f
reg add "HKCR\KMP.%%a\Shell\Open\Command" /ve /t REG_SZ /d "\"%VidApp%\" \"%%1\"" /f
)
echo 关联完成,重启explorer生效
pause
```
【关键点解释】
· 前两行 fltmc 那行是**自动提权**,没有它注册表写不进去(你代码里有这行,对的)
· `HKCR\.jpg`(扩展名)→ 类型名 `FSViewer.jpg` → 该类型的 `Shell\Open\Command` 指向 exe 路径,**三层缺一不可**
· 路径含空格/中文没问题,`\"%PicApp%\" \"%%1\"` 的引号嵌套是标准写法,`%%1` 代表被打开的文件
· 批处理里 for 循环内的变量用 `%%a`,路径变量 `%PicApp%` 在 for 内部也能正常展开(提前 set 过)
【Win11 特别注意】
如果之前右键图片选过「打开方式 → 其他应用」,扩展名下会残留 `UserChoice` 键值导致不生效,执行前先清一下:
```bat
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.jpg\UserChoice" /f
```
(.mp3/.mp4 同理,把 .jpg 换掉各执行一次)
或者最简单:右键图片 → 打开方式 → 选择其他应用 → 选你的绿色软件 → 勾选「始终使用此应用」,一次到位,连批处理都不用跑。
页:
[1]