无忧启动论坛

标题: 注册表里怎么使用相对路径?比如:%HOMEDRIVE%这种 [打印本页]

作者: netmjwork    时间: 2016-6-26 09:17
标题: 注册表里怎么使用相对路径?比如:%HOMEDRIVE%这种
本帖最后由 netmjwork 于 2016-6-28 09:25 编辑

在网上找了一个添加7z右键的注册表文件,里面路径是绝对路径可以使用,但是替换成 相对路径 就无法使用了,提示“拒绝访问”……
请教在注册表里 %HOMEDRIVE% 这种相对路径如何使用?谢谢!

如下的 c: 换成 %%HOMEDRIVE%% 就无法运行(也尝试 %HOMEDRIVE%都不行),提示“拒绝访问”,但如果是 c: 的话可以正常运行。
[HKEY_CLASSES_ROOT\7-Zip.zip\shell\open\command]
@="\" c: \\7zip\\7zFM.exe\" \"%1\""

[HKEY_CLASSES_ROOT\7-Zip.zip\shell\open\command]
@="\"%%HOMEDRIVE%%\\7zip\\7zFM.exe\" \"%1\""

作者: 窄口牛    时间: 2016-6-26 09:26
本帖最后由 窄口牛 于 2016-6-26 09:33 编辑

%SystemDrive%1.bat=c:\1.bat

另:set >path.txt
path.txt即可看到系统所有有效环境变量
作者: pogua007    时间: 2016-6-26 09:52
本帖最后由 pogua007 于 2016-6-26 09:56 编辑

诶,你怎么问这样的问题。这个问题确实比较古怪,解决方法更是古怪的非常没有道理,使用也非常不方便。
如果要使用变量作为command的路径,需要@值的数据类型是可扩充的字符串(REG_EXPAND_SZ),还有你的语法也不对,一般的系统变量调用都是一个%,除了批处理文件中,因为cmd解释器的原因,要两个%。
知道这些解决也是很麻烦的,
一、注册表编辑器、vbs、reg命令都是没有办法修改数据类型的;
二、默认值是没有办法删除的;
三、可扩充的字符串(REG_EXPAND_SZ)转换是也是一个问题,REG_EXPAND_SZ值在reg文件中是很长的二进制数据,因为用的少也没有找转换的办法,目前的办法只有在注册表编辑器中设置好数值,然后导出为reg文件。
如你例子中的解决办法就是,在你要改的项下,新建一个可扩充的字符串(REG_EXPAND_SZ)值,然后设置数据为,你需要的数据,比如你7z的路径上面,就应该写为%SystemDrive%\7-Zip\7zFM.exe "%1",然后导出注册表文件,再修改注册表文件,先加一行删除项的。然后删除默认值,把你后来加的可扩充的字符串值,改名为@。然后导入注册表文件。具体注册表内容如下:
  1. Windows Registry Editor Version 5.00

  2. [-HKEY_CLASSES_ROOT\7-Zip.rar\shell\open\command]

  3. [HKEY_CLASSES_ROOT\7-Zip.rar\shell\open\command]
  4. @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,44,00,72,00,69,00,76,00,65,\
  5.   00,25,00,5c,00,37,00,2d,00,5a,00,69,00,70,00,5c,00,37,00,7a,00,46,00,4d,00,\
  6.   2e,00,65,00,78,00,65,00,20,00,22,00,25,00,31,00,22,00,00,00
复制代码

目前就这一个办法,我目测一下这个可扩充字符串好象就是16进制文本吗,不过就是知道了也很麻烦。
晕,我写的路径是%SystemDrive%\7-Zip\7zFM.exe,你的是%SystemDrive%\7Zip\7zFM.exe,你要拿去直接测试也会出错,导入之后自己修改吧,你看这也是一个麻烦,不能直接修改值。
作者: 807979023    时间: 2016-6-26 10:34
本帖最后由 807979023 于 2016-6-26 13:02 编辑

我是先将reg文件转换为批处理,再修改c:为变量%SystemDrive%,最后运行批处理修改注册表。

原reg:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\7-Zip.zip\shell\open\command]
@="\" c: \\7zip\\7zFM.exe\" \"%1\""

转为批处理:
@echo off
reg add "HKCR\7-Zip.zip\shell\open\command" /ve /d "\" c: \7zip\7zFM.exe\" \"%%1\"" /f

修改批处理后运行:
@echo off
reg add "HKCR\7-Zip.zip\shell\open\command" /ve /d "\" %SystemDrive% \7zip\7zFM.exe\" \"%%1\"" /f

作者: pogua007    时间: 2016-6-26 11:00
本帖最后由 pogua007 于 2016-6-26 11:26 编辑
807979023 发表于 2016-6-26 10:34
我是先将reg文件先转换为批处理,再修改c:为变量%SystemDrive%,最后运行批处理修改注册表。

原reg:


你没有指定数据类型?默认还是字符串,不是可扩充的字符串,字符串不能用环境变量的
我试了一下,下面的写法可以
  1. reg add "HKCR\7-Zip.zip\shell\open\command" /ve /t REG_EXPAND_SZ /d "%%systemroot%%\7zip\7zFM.exe "^"%%1^""" /f
复制代码

尼玛,cmd的特殊字符处理真恶心
作者: netmjwork    时间: 2016-6-26 11:15
pogua007 发表于 2016-6-26 09:52
诶,你怎么问这样的问题。这个问题确实比较古怪,解决方法更是古怪的非常没有道理,使用也非常不方便。
如 ...

您这个方法我用不来,高手可以用~

是这样的,我想实现:
1、7zip的目录是任意
2、用批处理或VBS实现:运行后自动关联.7z格式的文件,增加“目录式”的右键菜单,“根菜单”是“77zz”(以便区别),
     子菜单一:对文件形式,命名为“极限压缩为7z”
     子菜单二:对文件形式,且仅仅后缀名是“.7z”的文件时,增加命名为“用7z打开”
     子菜单一:对文件夹、目录形式,命名为“极限压缩为7z”

网上看的代码不能实现“目录式”的菜单,倒是实现了文件和文件夹的右键菜单,还在研究……

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.7z]
@="77zz"

[HKEY_CLASSES_ROOT\77zz]
@="7z Archive"

[HKEY_CLASSES_ROOT\77zz\DefaultIcon]
@="c:\\7zip\\7z.ico"



[HKEY_CLASSES_ROOT\77zz\shell]
@=""
[HKEY_CLASSES_ROOT\77zz\shell\open]
@=""
[HKEY_CLASSES_ROOT\77zz\shell\open\command]
@="\"c:\\7zip\\7zFM.exe\" \"%1\""



[HKEY_CLASSES_ROOT\.7z\shell\Zip]
@="极限压缩为 .7z"
[HKEY_CLASSES_ROOT\.7z\shell\Zip\command]
@="\"c:\\7zip\\7zg.exe\" a -t7z -mx9 \"%1\".7z \"%1\""



[HKEY_CLASSES_ROOT\Folder\shell\7z]
@="极限压缩为 .7z"
[HKEY_CLASSES_ROOT\Folder\shell\7z\command]
@="\"c:\\7zip\\7zg.exe\" a -r -t7z -mx9 \"%1\".7z \"%1\""
作者: netmjwork    时间: 2016-6-26 11:18
807979023 发表于 2016-6-26 10:34
我是先将reg文件先转换为批处理,再修改c:为变量%SystemDrive%,最后运行批处理修改注册表。

原reg:

多谢分享!

是个好方法,我试下~
作者: netmjwork    时间: 2016-6-26 11:25
本帖最后由 netmjwork 于 2016-6-26 11:27 编辑
807979023 发表于 2016-6-26 10:34
我是先将reg文件先转换为批处理,再修改c:为变量%SystemDrive%,最后运行批处理修改注册表。

原reg:


您好,好像我要实现的就是您操作实现过的~

能帮忙看下实现 6楼 我希望的效果,全部需要几行吗?多谢!

那个我也不知道是不是每项都需要,而且无法实现“目录式”的菜单效果,我只需要我希望的简单效果就行,运行过完整的之后就没法验证了……
作者: pogua007    时间: 2016-6-26 12:11
netmjwork 发表于 2016-6-26 11:25
您好,好像我要实现的就是您操作实现过的~

能帮忙看下实现 6楼 我希望的效果,全部需要几行吗?多谢 ...

你到底问的是在注册表的command中使用环境变量,还是问右键菜单增加子菜单。
如果command使用环境变量,必须默认值的类型为REG_EXPAND_SZ。
增加子菜单很难,一般都是加载DLL实现的。
作者: 窄口牛    时间: 2016-6-26 12:20
建议你把rar的右键导出来,修改了打回去试试。
作者: netmjwork    时间: 2016-6-26 12:31
pogua007 发表于 2016-6-26 12:11
你到底问的是在注册表的command中使用环境变量,还是问右键菜单增加子菜单。
如果command使用环境变量, ...

想实现6楼说的效果,包括子菜单
如果子菜单还需要dll实现那就算了,可能太麻烦
作者: netmjwork    时间: 2016-6-26 12:33
窄口牛 发表于 2016-6-26 12:20
建议你把rar的右键导出来,修改了打回去试试。

关键是不知道导哪些项……

作者: 807979023    时间: 2016-6-26 12:59
pogua007说得对,数据类型是字符串的确不能用环境变量,虽然能导入,实际使用时出錯。
下面是使用成功的右键调用rar,只是文件和文件夹右键调用rar。
与你的要求不相同,只能供参考。

@echo off
reg add "HKCR\*\shell\winrar" /ve /d "打开winrar" /f
reg add "HKCR\*\shell\winrar\command" /ve /t REG_EXPAND_SZ /d "%%ProgramFiles%%\winrar\WinRAR.exe" /f
reg add "HKCR\Folder\shell\winrar" /ve /d "打开winrar" /f
reg add "HKCR\Folder\shell\winrar\command" /ve /t REG_EXPAND_SZ /d "%%ProgramFiles%%\winrar\WinRAR.exe" /f
reg add "HKLM\SOFTWARE\Classes\*\shell\winrar" /ve /d "打开winrar" /f
reg add "HKLM\SOFTWARE\Classes\*\shell\winrar\command" /ve /t REG_EXPAND_SZ /d "%%ProgramFiles%%\winrar\WinRAR.exe" /f
reg add "HKLM\SOFTWARE\Classes\Folder\shell\winrar" /ve /d "打开winrar" /f
reg add "HKLM\SOFTWARE\Classes\Folder\shell\winrar\command" /ve /t REG_EXPAND_SZ /d "%%ProgramFiles%%\winrar\WinRAR.exe" /f


运行后右键任意文件效果如下:

2.JPG (32.43 KB, 下载次数: 161)

2.JPG

作者: pogua007    时间: 2016-6-26 13:17
我日,终于找到怎么右键菜单加子菜单了,千辛万苦找到一个例子,还没有消化,等我研究研究,不过发现我应该睡觉了。这么原创的办法,应该发帖。我可能不回贴了。
我马上就不用explorer做shell了,我这是何苦呢。
作者: netmjwork    时间: 2016-6-26 15:05
807979023 发表于 2016-6-26 12:59
pogua007说得对,数据类型是字符串的确不能用环境变量,虽然能导入,实际使用时出錯。
下面是使用成功的右 ...

多谢帮助!
我再修改修改来使用
作者: netmjwork    时间: 2016-6-26 15:07
pogua007 发表于 2016-6-26 13:17
我日,终于找到怎么右键菜单加子菜单了,千辛万苦找到一个例子,还没有消化,等我研究研究,不过发现我应该 ...

期待您研究后分享下 ,多谢!
作者: netmjwork    时间: 2016-6-26 16:05
807979023 发表于 2016-6-26 12:59
pogua007说得对,数据类型是字符串的确不能用环境变量,虽然能导入,实际使用时出錯。
下面是使用成功的右 ...

另外请教下:
HKCR\*\shell\
HKLM\SOFTWARE\Classes\*\shell

这两个地方都需要操作吗?有什么区别?
好像只用上面的也行……
作者: nttwqz    时间: 2016-6-26 17:18
先看看效果图



大体如此,有问题再自己该吧


  1. @ECHO OFF
  2. rem 自动请求以管理员权限运行
  3. echo CreateObject^("Shell.Application"^).ShellExecute "%~f0", "", "", "runas", 1 > "%temp%\getadmin.vbs"
  4. reg query HKU\S-1-5-20>nul 2>nul||cscript //b "%temp%\getadmin.vbs"&&del "%temp%\getadmin.vbs" /f /q>nul 2>nul&&exit /b

  5. ECHO 1. 增加带子菜单的右键菜单77zz并关联.7z
  6. ECHO 2. 删除带子菜单的右键菜单77zz并取消关联.7z
  7. echo.
  8. SET /P SEL=
  9. echo.
  10. IF %SEL%==2 CALL :DEL
  11. IF %SEL%==1 CALL :ADD
  12. echo.
  13. echo.
  14. PAUSE
  15. EXIT

  16. :ADD
  17. REM 设置关联
  18. REG ADD HKCR\.7z /D "7-Zip.7z" /F
  19. REG ADD HKCR\7-Zip.7z /D "7z Archive" /F
  20. REG ADD HKCR\7-Zip.7z\DefaultIcon /VE /T REG_EXPAND_SZ /D ""%SYSTEMDRIVE%\Soft\7zip\7z.dll,0"" /F
  21. REG ADD HKCR\7-Zip.7z\shell\open\command /VE /T REG_EXPAND_SZ /D ""%SYSTEMDRIVE%\Soft\7zip\7zFM.exe" "%%1"" /F

  22. REM ------------------------增加带子菜单的右键菜单------------------------>>

  23. REM 定义子菜单具体内容
  24. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax /VE /D "极限压缩为7z" /F
  25. REM 注意:你提供的极限压缩命令有问题,请自己解决,我懒的研究了。
  26. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax\command /D ""%SYSTEMDRIVE%\Soft\7zip\7zg.exe" a -r -t7z -mx9 "%1" .7z "%1"" /F
  27. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz /D "用7Z打开" /F
  28. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz\command /D ""%SYSTEMDRIVE%\Soft\7zip\7zFM.exe" "%1"" /F

  29. REM 定义子菜单要项目名称列表
  30. REG ADD HKCR\*\shell\77zz /V "SubCommands" /D "77zzmax;OpenWith77zz" /F
  31. REM 定义描述,默认77zz可以省略此键值
  32. REG ADD HKCR\*\shell\77zz /V "MUIVerb" /D "77zz" /F
  33. REM 定义图标,不要可以省略此键值
  34. REG ADD HKCR\*\shell\77zz /V "Icon" /D "%SYSTEMDRIVE%\Soft\7zip\7z.dll,0" /F

  35. REM 增加文件夹右键菜单和显示的子菜单
  36. REG ADD HKCR\Directory\shell\7zz /V "SubCommands" /D "77zzmax" /F
  37. REM 定义图标,不要可以省略此键值
  38. REG ADD HKCR\Directory\shell\7zz  /V "Icon" /D "%SYSTEMDRIVE%\Soft\7zip\7z.dll,0" /F
  39. REM <<------------------------增加带子菜单的右键菜单------------------------
  40. GOTO :EOF

  41. :DEL
  42. REM 清理关联
  43. REG DELETE HKCU\Software\7-Zip /F 2>NUL
  44. REG DELETE HKCR\.7z /F 2>NUL
  45. REG DELETE HKCR\7-Zip.7z /F 2>NUL

  46. REM 清理右键菜单
  47. REG DELETE HKCR\*\shell\77zz /F 2>NUL
  48. REG DELETE HKCR\Directory\shell\7zz /F 2>NUL
  49. REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax /F 2>NUL
  50. REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz /F 2>NUL
  51. GOTO :EOF
复制代码

作者: nttwqz    时间: 2016-6-26 17:23
本帖最后由 nttwqz 于 2016-6-26 17:26 编辑

如果想注册表中的值内容是%SYSTEMDRIVE%,改成%%SYSTEMDRIVE%%即可。参考23行。
作者: netmjwork    时间: 2016-6-26 17:42
nttwqz 发表于 2016-6-26 17:23
如果想注册表中的值内容是%SYSTEMDRIVE%,改成%%SYSTEMDRIVE%%即可。参考23行。

非常感谢!我再试试~

网上查到另一种解决相对路径的写法:
reg add "HKEY_CLASSES_ROOT\*\shell\notepad++\command" /ve   /d "\"%cd%\notepad++.exe\" %%0 " /f
作者: nttwqz    时间: 2016-6-26 18:48
netmjwork 发表于 2016-6-26 17:42
非常感谢!我再试试~

网上查到另一种解决相对路径的写法:

%~dp0

批处理需要在7Z目录下'或者在开头加个pushd %~dp0,你这注册表就不用好了。
作者: netmjwork    时间: 2016-6-26 18:59
本帖最后由 netmjwork 于 2016-6-26 20:30 编辑
nttwqz 发表于 2016-6-26 17:18
先看看效果图


您好,那命令是网上抄的,我测试过没有问题

REG ADD HKCR\7-Zip.7z /D "7z Archive" /F   这句起什么作用?

REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax\command
问题就出在这行,这行是什么作用呢?为什么不是以前单独对文件和文件夹分别来设置?
我是XP系统,始终没有出现子菜单,替换内容后也无法使用……
右键只有孤零零一个77ZZ/7zz在那里,点击提示“该文件没有程序与之关联来执行该操作。请在控制面板的文件夹选项中创建关联”

和命令没有关系,因为我换如下的都还是报错“命令行参数无效”
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax\open\command /D "C:\soft\7zip\7zFM.exe"  /F

就两行命令报错,可能也就因为这个原因,子菜单根本不能出现,功能也无法用
按说对一般不是.7z文件来说是没有“用7z打开”的菜单,现在一般文件右键只有一个“77zz”没法用,应该调整好还是目录的形式


补充一点:我测试命令成功是在注册表里面操作成功,不是批处理,比如下面这段
[HKEY_CLASSES_ROOT\*\shell\Zip\command]
@="\"c:\\7zip\\7zg.exe\" a -t7z -mx9 \"%1\".7z \"%1\""


作者: netmjwork    时间: 2016-6-26 19:21
nttwqz 发表于 2016-6-26 18:48
%~dp0

批处理需要在7Z目录下'或者在开头加个pushd %~dp0,你这注册表就不用好了。

注册表看来还是没批处理好用……  

他那个批处理开头没有加pushd %~dp0,测试正常使用
他提示是:%0表示传递的是文件名称,%V表示传递的是文件夹的名称
作者: nttwqz    时间: 2016-6-26 23:18
netmjwork 发表于 2016-6-26 18:59
您好,那命令是网上抄的,我测试过没有问题

REG ADD HKCR\7-Zip.7z /D "7z Archive" /F   这句起什 ...

虚拟机中的XP已经删了,只能用03PE测试了,的确无法显示,原因未知。
参数错误已经修正,XP的reg命令没有/VE 参数会报错。
7z文件图标显示异常的问题已经修正
现在一般文件不会显示用7z打开了


  1. @ECHO OFF
  2. rem 自动请求以管理员权限运行
  3. echo CreateObject^("Shell.Application"^).ShellExecute "%~f0", "", "", "runas", 1 > "%temp%\getadmin.vbs"
  4. reg query HKU\S-1-5-20>nul 2>nul||cscript //b "%temp%\getadmin.vbs"&&del "%temp%\getadmin.vbs" /f /q>nul 2>nul&&exit /b
  5. pushd %~dp0

  6. ECHO 1. 增加带子菜单的右键菜单77zz并关联.7z
  7. ECHO 2. 删除带子菜单的右键菜单77zz并取消关联.7z
  8. echo.
  9. SET /P SEL=
  10. echo.
  11. IF %SEL%==2 CALL :DEL
  12. IF %SEL%==1 CALL :ADD
  13. echo.
  14. echo.
  15. PAUSE
  16. EXIT

  17. :ADD
  18. REM 设置关联
  19. if not exist %cd%\7zfm.exe echo 未发现7-Zip主程序,请将我放在7-Zip根目录下。&pause>nul&exit
  20. REG ADD HKCR\.7z /VE /D "7-Zip.7z" /F
  21. REG ADD HKCR\7-Zip.7z /VE /D "7z Archive" /F
  22. REG ADD HKCR\7-Zip.7z\DefaultIcon /VE /T REG_SZ /D "%cd%\7z.dll,0" /F
  23. REG ADD HKCR\7-Zip.7z\shell\open\command /VE /T REG_EXPAND_SZ /D ""%cd%\7zFM.exe" "%%1"" /F

  24. REM ------------------------增加带子菜单的右键菜单------------------------>>

  25. REM 定义子菜单具体内容
  26. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax /VE /D "极限压缩为7z" /F
  27. REM 注意:你提供的极限压缩命令有问题,请自己解决,我懒的研究了。
  28. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax\command /VE /D ""%cd%\7zg.exe" a -r -t7z -mx9 "%%1" .7z "%%1"" /F
  29. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz /VE /D "用7z打开" /F
  30. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz\command /VE /D ""%cd%\7zFM.exe" "%%1"" /F

  31. REM 定义子菜单要项目名称列表
  32. REG ADD HKCR\*\shell\77zz /V "SubCommands" /D "77zzmax" /F
  33. REG ADD HKCR\7-Zip.7z\shell\77zz /V "SubCommands" /D "77zzmax;OpenWith77zz" /F
  34. REM 定义名称,默认77zz可以省略此键值
  35. REG ADD HKCR\*\shell\77zz /V "MUIVerb" /D "77zz" /F
  36. REM 定义图标,不要可以省略此键值
  37. REG ADD HKCR\*\shell\77zz /V "Icon" /D "%cd%\7z.dll,0" /F
  38. REG ADD HKCR\7-Zip.7z\shell\77zz /V  "Icon" /D "%cd%\7z.dll,0" /F

  39. REM 增加文件夹右键菜单和显示的子菜单
  40. REG ADD HKCR\Directory\shell\7zz /V "SubCommands" /D "77zzmax" /F
  41. REM 定义图标,不要可以省略此键值
  42. REG ADD HKCR\Directory\shell\7zz  /V "Icon" /D "%cd%\7z.dll,0" /F
  43. REM <<------------------------增加带子菜单的右键菜单------------------------
  44. GOTO :EOF

  45. :DEL
  46. REM 清理关联
  47. REG DELETE HKCU\Software\7-Zip /F 2>NUL
  48. REG DELETE HKCR\.7z /F 2>NUL
  49. REG DELETE HKCR\7-Zip.7z /F 2>NUL

  50. REM 清理右键菜单
  51. REG DELETE HKCR\*\shell\77zz /F 2>NUL
  52. REG DELETE HKCR\Directory\shell\7zz /F 2>NUL
  53. REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax /F 2>NUL
  54. REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz /F 2>NUL
  55. GOTO :EOF
复制代码

作者: singel    时间: 2016-6-26 23:27
XP系统不支持注册表写目录式子菜单,NT6以上才支持
作者: nttwqz    时间: 2016-6-26 23:40
singel 发表于 2016-6-26 23:27
XP系统不支持注册表写目录式子菜单,NT6以上才支持

哈哈哈哈,不知道楼主什么感觉,折腾了半天,竟然不支持。

多谢科普,我也不知道。


其实吧,感觉楼主把简单的问题复杂化了,7-Zip安装包本身很小,没必要绿色,静默安装也很快(/S,S必须大写),安装好之后就有右键菜单了,如果想自定义右键菜单和文件关联,手动设置一下,用RegWorkshop对比一下注册表就好了
作者: nttwqz    时间: 2016-6-26 23:53
REG ADD HKCR\7-Zip.7z /D "7z Archive" /F   这句起什么作用?


文件类型描述,比如改成 楼主被冰激凌绊倒了,就有了下面的效果(可能需要重启)。


作者: pogua007    时间: 2016-6-27 00:02
nttwqz 发表于 2016-6-26 23:40
哈哈哈哈,不知道楼主什么感觉,折腾了半天,竟然不支持。

多谢科普,我也不知道。 ...

我很看好楼主哈,很有想法,搞技术不怕知识缺乏,不怕菜,敢想敢干才是重要的,知识是可以增长的,有想法才有发展前途。
楼主也不是什么伸手党,他会从多种途径努力寻找解决办法,虽然因为水平的限制,暂时无法鉴别和组合找到的东西,但是确实是很努力的自己解决问题。这很好,希望继续坚持这种独立自主、自力更生的好习惯。
楼主请求人帮忙的时候也很虚心,很有礼貌,很注意方法,总是努力的想表述清楚自己的想要什么。
总之这是个不错的小伙子,他给了我一种十几年前逛论坛的那种感觉,有能力的请多多帮助他,期待他的成长。
作者: netmjwork    时间: 2016-6-27 08:24
nttwqz 发表于 2016-6-26 23:40
哈哈哈哈,不知道楼主什么感觉,折腾了半天,竟然不支持。

多谢科普,我也不知道。 ...

非常感谢您!
很晚了还专门用03测试一遍……

您说的应该是安装包用/S参数,这个还真不知道,我是安装后再设置,要么复制解压后的文件夹,以后换环境用觉得麻烦,才想起来操作“一键式”的效果

新手可能会经常因为不了解犯这种“复杂化”的错误,最开始找到的答案是注册表,就从注册表开始解决了……
确认您那第一版子菜单无效后就用最简单的一个右键,后来用的注册表抓取(是程序自动生成自定义)解决的,但不知道系统通用性怎么样,可能win7还会有些问题,以后再调整,收藏您的方法~

作者: netmjwork    时间: 2016-6-27 08:33
pogua007 发表于 2016-6-27 00:02
我很看好楼主哈,很有想法,搞技术不怕知识缺乏,不怕菜,敢想敢干才是重要的,知识是可以增长的,有想法 ...

谢谢鼓励!

现在是为了一些想法啃代码(没有基础只能啃了~),没有基础也只能实现一些简单的效果,现在是想解决一部分实用性的问题。

其实也正常的,不会又想实现的效果就要虚心的向别人请教,别人帮助解答了一定要认真感谢别人的,如果因为忙或别的原因不能解答那就自己找别的方法解决,实在不行就只能放着以后有时间解决了……
作者: netmjwork    时间: 2016-6-27 08:45
singel 发表于 2016-6-26 23:27
XP系统不支持注册表写目录式子菜单,NT6以上才支持

谢谢~  
早知道xp就不去想着弄子菜单了……
一个右键菜单还省事儿~
作者: pogua007    时间: 2016-6-27 08:45
netmjwork 发表于 2016-6-27 08:33
谢谢鼓励!

现在是为了一些想法啃代码(没有基础只能啃了~),没有基础也只能实现一些简单的效果, ...

你上次问那个7z不能解压至win10带空格的路径的问题里面,我给你举的例子里面就有7z静默安装的示例。不过静默安装之后的默认设置很不怎么样,除了7z之外,zip和rar文件都没有关联。菜单也没有设置,如果不想手工设置,还要导入注册表。
作者: netmjwork    时间: 2016-6-27 08:48
nttwqz 发表于 2016-6-26 23:18
虚拟机中的XP已经删了,只能用03PE测试了,的确无法显示,原因未知。
参数错误已经修正,XP的reg命令没 ...

这个还是有点儿小问题,带空格路径居然不识别?
确定是路径的问题,代码里没有and这个词……




作者: netmjwork    时间: 2016-6-27 09:12
pogua007 发表于 2016-6-27 08:45
你上次问那个7z不能解压至win10带空格的路径的问题里面,我给你举的例子里面就有7z静默安装的示例。不过 ...

不怕您笑话,上次那段儿代码没看太明白,方便的话帮忙注释下每行,以后会用到,多谢!
有几个问题不确定:
1、解压路径设置在哪里了?  %ProgramW6432% 这个是设置的解压路径吗?代表着什么路径
2、安装7zip好像没见使用“/S”这种参数?
3、比方说我指定解压到“%homedrive%\Progra~1”里,下一步运行里面子目录里的“office\go.vbs”应该怎么写?
start "" "%homedrive%\Progra~1\office\go.vbs"这句增加到后面就是一个完整的解压运行的流程,对吗?


Start /Wait Msiexec /q /I %SystemRoot%\Setup\Scripts\7z1514-x64.msi
set tmp0=%ProgramW6432%
for %%x in ("%tmp0%") do set tmp0=%%~sx
set tmp1=%tmp0%\7-Zip\7z
%tmp1% x %SystemRoot%\Setup\Scripts\压缩包.7z -o%tmp0%
作者: pogua007    时间: 2016-6-27 09:13
本帖最后由 pogua007 于 2016-6-27 09:16 编辑

批处理的解释器再加上reg命令的解释器把特殊字符的处理搞的非常麻烦。像双引号就是特殊字符,nttwqz给的批处理里面命令经过两重解释道注册表中,程序部分是没有引号的,所以会无法识别带空格的路径。
想要路径带引号,命令要这样写,为了处理这字符串,我昨天都在5楼开骂了。
  1. reg add HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ  /D """%%systemroot%%\7zip\7zFM.exe"" "^"%%1^""" /f
复制代码

命令效果如下

作者: 窄口牛    时间: 2016-6-27 09:20
这个是要在pe里,还是系统里用的?
作者: 窄口牛    时间: 2016-6-27 09:21
c盘下直接7zip文件夹,不乱吗?
作者: pogua007    时间: 2016-6-27 09:31
本帖最后由 pogua007 于 2016-6-27 09:44 编辑
netmjwork 发表于 2016-6-27 09:12
不怕您笑话,上次那段儿代码没看太明白,方便的话帮忙注释下每行,以后会用到,多谢!
有几个问题不确定 ...


我用的是msi格式的安装包,这种安装包是使用Windows Installer服务进行安装的,天生支持静默安装。
静默安装方法为:Msiexec /q /I 程序包名称,
也可以是:程序包 /q或者/qn。
如果是可能会重启的安装程序,可以加/norestart参数不重启,你在运行或者cmd中打Msiexec,可以看帮助。

解压路径是%ProgramW6432%,%ProgramW6432%是环境变量哈和%systemroot%还%windir%是一样的,值是Program Files文件夹。
你在CMD中输入set命令,可以查看当前CMD窗口的环境变量和自定义变量,比如set tmp0=%ProgramW6432%,就是定义了自定义变量tmp0。
for %%x in ("%tmp0%") do set tmp0=%%~sx是把路径转换为8.3格式的短路径,因为7z的解压参数不支持路径带空格,但是我解压的目的地Program Files文件夹中间是带空格的,所以要转换路径格式。
你要是解压缩的路径不带空格,并且是确定的值比如是C:\123\345可以直接输
7z.exe 压缩包.7z -oc:\123\345
-o是指定解压路径,注意-o后面要紧跟路径,没有空格

要直接运行VBS,call命令最好,不像start命令那样因为空格会产生标题错误
"%homedrive%\Progra~1不就是Program Files文件夹吗,你直接用%ProgramW6432%变量就是了。call "%ProgramW6432%\office\go.vbs",call命令加了引号就不需要再转换为短路径了
作者: netmjwork    时间: 2016-6-27 09:42
pogua007 发表于 2016-6-27 09:13
批处理的解释器再加上reg命令的解释器把特殊字符的处理搞的非常麻烦。像双引号就是特殊字符,nttwqz给的批 ...

多谢!照葫芦画瓢出问题了…… 下面这种怎么改?(还有^符号……,不知道怎么来套格式了)
空闲时帮忙看下,不耽误工作,多谢!

REG ADD HKCR\7-Zip.7z\DefaultIcon /VE /T REG_SZ /D ""%%cd%%\7z.dll,0"" /F
REG ADD HKCR\7-Zip.7z\shell\open\command /VE /T REG_EXPAND_SZ /D ""\"%%cd%%\7zFM.exe"\" \"^"%%1^"\"" /F
WARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax\command /VE /D ""\"%%cd%%\7zg.exe"\" a -r -t7z -mx9 \"^"%%1^"\" .7z \"^"%%1^"\"" /F
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz\command /VE /D "\"%cd%\7zFM.exe\" \"^"%%1^"\"" /F
作者: pogua007    时间: 2016-6-27 09:48
窄口牛 发表于 2016-6-27 09:20
这个是要在pe里,还是系统里用的?

那批处理片段是我的SetupComplete.cmd一部分,因为我不封装系统,要后期处理和集成软件就只能用SetupComplete.cmd了。SetupComplete.cmd的作用类似于XP的T13或是T9整合,都是在oobe阶段调用的,不过windows7+oobe之后就不重启了。
作者: pogua007    时间: 2016-6-27 10:04
本帖最后由 pogua007 于 2016-6-27 10:54 编辑
netmjwork 发表于 2016-6-27 09:42
多谢!照葫芦画瓢出问题了…… 下面这种怎么改?(还有^符号……,不知道怎么来套格式了)
空闲时帮忙看 ...


这个命令中^和\作用是一样的,都是转义符,意思是下一个字符是原本的字符,不是特殊标志符号。不过使用\会容易混淆,使程序更不易读,所以尽量用^,你把两个都用上肯定会出错的。
我估计你就把\的作用理解错了,确实是容易和路径中的\搞混,注意这命令中的\是转义符,不是命令必须的格式。我得研究研究完全不用\应该怎么写。
不能用%CD%,%CD%是临时变量,获得当前工作路径。如图所示红框部分的东西。

更不能用%%cd%%,即使这命令成功了,到注册表会把你的7z程序路径设置为%cd%\7zg.exe,运行的时候不知道shell解释不解释%cd%,就是解释了鬼知道当前工作目录是什么地方。
我不知道你的7z程序路径在哪,你直接把“%%systemroot%%\7zip\7zFM.exe”改成你的程序路径就行了,如果使用环境变量就要给变量加两个%%。

娘的,实在没有办法了,^没有办法转义空格,至少得写一个\
  1. reg add HKEY_LOCAL_MACHINE\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ  /D ""^"%%systemroot%%\7zip\7zFM.exe"" ^""%%1"^"" /f
复制代码

求高手赐教,不用\做转义符,上面的命令怎么写。写入注册的数据为"%systemroot%\7zip\7zFM.exe" "%1",见下图
[attach]247084[/attach]
作者: nttwqz    时间: 2016-6-27 18:37
pogua007 发表于 2016-6-27 10:04
这个命令中^和\作用是一样的,都是转义符,意思是下一个字符是原本的字符,不是特殊标志符号。不过使用 ...

一直以来,我都认为注册表reg中只能使用\转义,经过测试发现,可以用"代替,输入更方便(一个键上面)


  1. echo y| reg add HKLM\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ /d """%"systemdrive"%"\7zip\7zFM.exe""" """%1"""
复制代码

作者: netmjwork    时间: 2016-6-27 19:18
pogua007 发表于 2016-6-27 09:31
我用的是msi格式的安装包,这种安装包是使用Windows Installer服务进行安装的,天生支持静默安装。
静 ...

是的,我就是直接用短地址来作为相对路径的“绝对地址”,不至于跑到x86去,多谢!

vbs一般用run命令多,一般情况下可以无视空格路径
作者: netmjwork    时间: 2016-6-27 19:59
本帖最后由 netmjwork 于 2016-6-27 20:12 编辑
nttwqz 发表于 2016-6-27 18:37
一直以来,我都认为注册表reg中只能使用\转义,经过测试发现,可以用"代替,输入更方便(一个键上面)

...


reg add HKLM\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ /d  "\"%HOMEDRIVE%\7zip\7zfm.exe\" %%0" /f
"C:\7zip\7zfm.exe" %0

echo y| reg add HKLM\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ /d """%"systemdrive"%"\7zip\7zFM.exe""" """%1"""
"%systemdrive%\7zip\7zFM.exe" "%1"

输出值不同,上面一个直接识别出是C盘路径

有点儿混淆了,现在问题是批处理本身在含空格的目录里无法运行(比如桌面),在不含空格的目录里识别空格路径是没问题的……(单条加入注册表没有问题)
作者: nttwqz    时间: 2016-6-27 20:07
netmjwork 发表于 2016-6-27 19:59
reg add HKLM\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ /d  "\"%HOMEDRIVE%\7zip\7zfm.exe\" %%0" /f
"C: ...
%HOMEDRIVE%


你后面加了,前面为何不加?%%HOMEDRIVE%%
作者: pogua007    时间: 2016-6-27 20:26
本帖最后由 pogua007 于 2016-6-27 20:56 编辑
netmjwork 发表于 2016-6-27 19:59
reg add HKLM\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ /d  "\"%HOMEDRIVE%\7zip\7zfm.exe\" %%0" /f
" ...


谢谢哈,echo y加在前面是不是后面的/f无法识别了,不过至少不用\了。
这个转义太见鬼了,我试试大杀器,把这命令拆成两句用变量看看。

搞不出来,抓狂 不搞了
作者: netmjwork    时间: 2016-6-27 20:29
本帖最后由 netmjwork 于 2016-6-27 20:31 编辑
nttwqz 发表于 2016-6-27 20:07
你后面加了,前面为何不加?%%HOMEDRIVE%%


没明白什么意思……?

好像是批处理前面没识别当前路径,单条执行的话看注册表输出的值是正确的:
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax\command /VE /D "\"%cd%\7zg.exe\" a -r -t7z -mx9 \"%%1\" .7z \"%%1\"" /F

值为 "C:\Documents and Settings\Administrator\桌面\7zg.exe" a -r -t7z -mx9 "%1".7z "%1"
作者: pogua007    时间: 2016-6-27 21:00
本帖最后由 pogua007 于 2016-6-27 21:04 编辑
netmjwork 发表于 2016-6-27 20:29
没明白什么意思……?

好像是批处理前面没识别当前路径,单条执行的话看注册表输出的值是正确的:


用一个%把变量名括起来,就被cmd解释为变量的值,用两个%%括起来,就被解释为字符串:%变量名%。
你确定要用%cd%变量吗?这个变量是当前的工作目录,控制很难的,如果要是想指定当前批处理文件的路径最好用%~dp0
作者: nttwqz    时间: 2016-6-27 21:18
本帖最后由 nttwqz 于 2016-6-27 22:11 编辑
pogua007 发表于 2016-6-27 20:26
谢谢哈,echo y加在前面是不是后面的/f无法识别了,不过至少不用\了。
这个转义太见鬼了,我试试大杀 ...


是呀,好奇怪,这个/f参数有时起作用,有时不起作用,看了下值,被当成值得一部分了,太坑爹了,所以干脆就在前面用了echo y|,也不知道是不是哪里写错了。


我突然感觉我是哪里写错了,记得没错的话,/d 后面的值如果有空格,应该用""引起来,而被注册表键值本身的引号吸引了,以至于忘了两头的双引号,等会再试试……


果然,多加了一对引号,/f参数就管用了

  1. reg add HKLM\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ /d """"%"systemdrive"%"\7zip\7zFM.exe""" """%1"""" /f
复制代码


不过,这样看起来不容易理解,不如原来的\"容易理解。

  1. reg add HKLM\SOFTWARE\7-Zip\ /ve /t REG_EXPAND_SZ /d ""%%systemdrive%%\7zip\7zFM.exe" "%%1"" /f
复制代码


我的理解是,"也是特殊字符,键值里包含",除了使用\转义之外,还可以使用一对""将"引起来,就是"""这样了,再在两头加一对引号,所以两边就有了四个引号。
作者: nttwqz    时间: 2016-6-27 22:03
netmjwork 发表于 2016-6-27 20:29
没明白什么意思……?

好像是批处理前面没识别当前路径,单条执行的话看注册表输出的值是正确的:
  1. @ECHO OFF
  2. rem 自动请求以管理员权限运行
  3. echo CreateObject^("Shell.Application"^).ShellExecute "%~f0", "", "", "runas", 1 > "%temp%\getadmin.vbs"
  4. reg query HKU\S-1-5-20>nul 2>nul||cscript //b "%temp%\getadmin.vbs"&&del "%temp%\getadmin.vbs" /f /q>nul 2>nul&&exit /b
  5. pushd %~dp0

  6. ECHO 1. 增加带子菜单的右键菜单77zz并关联.7z
  7. ECHO 2. 删除带子菜单的右键菜单77zz并取消关联.7z
  8. echo.
  9. SET /P SEL=
  10. echo.
  11. IF %SEL%==2 CALL :DEL
  12. IF %SEL%==1 CALL :ADD
  13. echo.
  14. echo.
  15. PAUSE
  16. EXIT

  17. :ADD
  18. REM 设置关联
  19. if not exist %~dps07zfm.exe echo 未发现7-Zip主程序,请将我放在7-Zip根目录下。&pause>nul&exit
  20. REG ADD HKCR\.7z /VE /D "7-Zip.7z" /F
  21. REG ADD HKCR\7-Zip.7z /VE /D "7z Archive" /F
  22. REG ADD HKCR\7-Zip.7z\DefaultIcon /VE /T REG_SZ /D "%~dps07z.dll,0" /F
  23. REG ADD HKCR\7-Zip.7z\shell\open\command /VE /T REG_EXPAND_SZ /D ""%~dp07zFM.exe" "%%1"" /F

  24. REM ------------------------增加带子菜单的右键菜单------------------------>>

  25. REM 定义子菜单具体内容
  26. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax /VE /D "极限压缩为7z" /F
  27. REM 注意:你提供的极限压缩命令有问题,请自己解决,我懒的研究了。
  28. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax\command /VE /D ""%~dp07zg.exe" a -r -t7z -mx9 "%%1" .7z "%%1"" /F
  29. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz /VE /D "用7Z打开" /F
  30. REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz\command /VE /D ""%~dp07zFM.exe" "%%1"" /F

  31. REM 定义子菜单要项目名称列表
  32. REG ADD HKCR\*\shell\77zz /V "SubCommands" /D "77zzmax" /F
  33. REG ADD HKCR\7-Zip.7z\shell\77zz /V "SubCommands" /D "77zzmax;OpenWith77zz" /F
  34. REM 定义名称,默认77zz可以省略此键值
  35. REG ADD HKCR\*\shell\77zz /V "MUIVerb" /D "77zz" /F
  36. REM 定义图标,不要可以省略此键值
  37. REG ADD HKCR\*\shell\77zz /V "Icon" /D "%~dps07z.dll,0" /F
  38. REG ADD HKCR\7-Zip.7z\shell\77zz /V  "Icon" /D "%~dps07z.dll,0" /F

  39. REM 增加文件夹右键菜单和显示的子菜单
  40. REG ADD HKCR\Directory\shell\7zz /V "SubCommands" /D "77zzmax" /F
  41. REM 定义图标,不要可以省略此键值
  42. REG ADD HKCR\Directory\shell\7zz  /V "Icon" /D "%~dps07z.dll,0" /F
  43. REM <<------------------------增加带子菜单的右键菜单------------------------
  44. GOTO :EOF

  45. :DEL
  46. REM 清理关联
  47. REG DELETE HKCU\Software\7-Zip /F 2>NUL
  48. REG DELETE HKCR\.7z /F 2>NUL
  49. REG DELETE HKCR\7-Zip.7z /F 2>NUL

  50. REM 清理右键菜单
  51. REG DELETE HKCR\*\shell\77zz /F 2>NUL
  52. REG DELETE HKCR\Directory\shell\7zz /F 2>NUL
  53. REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax /F 2>NUL
  54. REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz /F 2>NUL
  55. GOTO :EOF
复制代码

作者: nttwqz    时间: 2016-6-27 22:15
本想着,干脆学下NSIS,正好我也有这需求,重新打包一下7-zip,为楼主定制一个7-zip全静默安装包,但是简单看了下,好像又相当于要学一门脚本语言……
作者: netmjwork    时间: 2016-6-27 22:19
pogua007 发表于 2016-6-27 21:00
用一个%把变量名括起来,就被cmd解释为变量的值,用两个%%括起来,就被解释为字符串:%变量名%。
你确 ...

只是觉得%cd%更方便些,特别对于绿色软件
作者: netmjwork    时间: 2016-6-27 22:20
nttwqz 发表于 2016-6-27 22:03

非常感谢!
终于搞定了~
作者: nttwqz    时间: 2016-6-27 23:04
netmjwork 发表于 2016-6-27 22:20
非常感谢!
终于搞定了~

XP能显示子菜单了???
作者: owoqv    时间: 2016-9-13 15:14
经验之谈,谢谢楼主了,请继续努力












民间捉鬼师,重庆民间道士
作者: baolizhu    时间: 2017-2-3 09:13
@echo off reg add "HKCR\7-Zip.zip\shell\open\command" /ve /t reg_expand_sz /d "\" %SystemDrive% \7zip\7zFM.exe\" \"%%1\"" /f
作者: 黄超华    时间: 2017-2-13 09:27
感谢分享,谢谢楼主




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3