netmjwork 发表于 2016-6-27 08:45:24

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

谢谢~
早知道xp就不去想着弄子菜单了……
一个右键菜单还省事儿~

pogua007 发表于 2016-6-27 08:45:40

netmjwork 发表于 2016-6-27 08:33
谢谢鼓励!

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

你上次问那个7z不能解压至win10带空格的路径的问题里面,我给你举的例子里面就有7z静默安装的示例。不过静默安装之后的默认设置很不怎么样,除了7z之外,zip和rar文件都没有关联。菜单也没有设置,如果不想手工设置,还要导入注册表。

netmjwork 发表于 2016-6-27 08:48:29

nttwqz 发表于 2016-6-26 23:18
虚拟机中的XP已经删了,只能用03PE测试了,的确无法显示,原因未知。
参数错误已经修正,XP的reg命令没 ...

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



netmjwork 发表于 2016-6-27 09:12:42

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:54

本帖最后由 pogua007 于 2016-6-27 09:16 编辑

批处理的解释器再加上reg命令的解释器把特殊字符的处理搞的非常麻烦。像双引号就是特殊字符,nttwqz给的批处理里面命令经过两重解释道注册表中,程序部分是没有引号的,所以会无法识别带空格的路径。
想要路径带引号,命令要这样写,为了处理这字符串,我昨天都在5楼开骂了。
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:51

这个是要在pe里,还是系统里用的?

窄口牛 发表于 2016-6-27 09:21:42

c盘下直接7zip文件夹,不乱吗?

pogua007 发表于 2016-6-27 09:31:12

本帖最后由 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:23

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:26

窄口牛 发表于 2016-6-27 09:20
这个是要在pe里,还是系统里用的?

那批处理片段是我的SetupComplete.cmd一部分,因为我不封装系统,要后期处理和集成软件就只能用SetupComplete.cmd了。SetupComplete.cmd的作用类似于XP的T13或是T9整合,都是在oobe阶段调用的,不过windows7+oobe之后就不重启了。

pogua007 发表于 2016-6-27 10:04:29

本帖最后由 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”改成你的程序路径就行了,如果使用环境变量就要给变量加两个%%。

娘的,实在没有办法了,^没有办法转义空格,至少得写一个\
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",见下图

nttwqz 发表于 2016-6-27 18:37:12

pogua007 发表于 2016-6-27 10:04
这个命令中^和\作用是一样的,都是转义符,意思是下一个字符是原本的字符,不是特殊标志符号。不过使用 ...

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


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:53

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

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

vbs一般用run命令多,一般情况下可以无视空格路径

netmjwork 发表于 2016-6-27 19:59:06

本帖最后由 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:29

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: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无法识别了,不过至少不用\了。
这个转义太见鬼了,我试试大杀器,把这命令拆成两句用变量看看。

搞不出来,抓狂:dizzy: 不搞了

netmjwork 发表于 2016-6-27 20:29:06

本帖最后由 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:09

本帖最后由 pogua007 于 2016-6-27 21:04 编辑

netmjwork 发表于 2016-6-27 20:29
没明白什么意思……?

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


用一个%把变量名括起来,就被cmd解释为变量的值,用两个%%括起来,就被解释为字符串:%变量名%。
你确定要用%cd%变量吗?这个变量是当前的工作目录,控制很难的,如果要是想指定当前批处理文件的路径最好用%~dp0

nttwqz 发表于 2016-6-27 21:18:17

本帖最后由 nttwqz 于 2016-6-27 22:11 编辑

pogua007 发表于 2016-6-27 20:26
谢谢哈,echo y加在前面是不是后面的/f无法识别了,不过至少不用\了。
这个转义太见鬼了,我试试大杀 ...

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


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


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

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

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

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

我的理解是,"也是特殊字符,键值里包含",除了使用\转义之外,还可以使用一对""将"引起来,就是"""这样了,再在两头加一对引号,所以两边就有了四个引号。

nttwqz 发表于 2016-6-27 22:03:39

netmjwork 发表于 2016-6-27 20:29
没明白什么意思……?

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


@ECHO OFF
rem 自动请求以管理员权限运行
echo CreateObject^("Shell.Application"^).ShellExecute "%~f0", "", "", "runas", 1 > "%temp%\getadmin.vbs"
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
pushd %~dp0

ECHO 1. 增加带子菜单的右键菜单77zz并关联.7z
ECHO 2. 删除带子菜单的右键菜单77zz并取消关联.7z
echo.
SET /P SEL=
echo.
IF %SEL%==2 CALL :DEL
IF %SEL%==1 CALL :ADD
echo.
echo.
PAUSE
EXIT

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

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

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

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

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

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

REM 清理右键菜单
REG DELETE HKCR\*\shell\77zz /F 2>NUL
REG DELETE HKCR\Directory\shell\7zz /F 2>NUL
REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\77zzmax /F 2>NUL
REG DELETE HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\OpenWith77zz /F 2>NUL
GOTO :EOF

nttwqz 发表于 2016-6-27 22:15:53

本想着,干脆学下NSIS,正好我也有这需求,重新打包一下7-zip,为楼主定制一个7-zip全静默安装包,但是简单看了下,好像又相当于要学一门脚本语言……

netmjwork 发表于 2016-6-27 22:19:44

pogua007 发表于 2016-6-27 21:00
用一个%把变量名括起来,就被cmd解释为变量的值,用两个%%括起来,就被解释为字符串:%变量名%。
你确 ...

只是觉得%cd%更方便些,特别对于绿色软件

netmjwork 发表于 2016-6-27 22:20:48

nttwqz 发表于 2016-6-27 22:03


非常感谢!
终于搞定了~

nttwqz 发表于 2016-6-27 23:04:21

netmjwork 发表于 2016-6-27 22:20
非常感谢!
终于搞定了~

XP能显示子菜单了???

owoqv 发表于 2016-9-13 15:14:19

经验之谈,谢谢楼主了,请继续努力











static/image/common/sigline.gif
民间捉鬼师,重庆民间道士

baolizhu 发表于 2017-2-3 09:13:29

@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:25

感谢分享,谢谢楼主
页: 1 [2]
查看完整版本: 注册表里怎么使用相对路径?比如:%HOMEDRIVE%这种