标题: [注册表类] 怎样从多个注册表键准确高效查找较新的Office安装路径和版本号? [打印本页]
作者: aries215 时间: 2017-2-25 12:56 标题: 怎样从多个注册表键准确高效查找较新的Office安装路径和版本号?
本帖最后由 aries215 于 2017-3-3 18:49 编辑
因为部分人可能不是默认路径安装,所以不能用 for /d %%a in ("%ProgramFiles%\Microsoft Office\O*")
只能通过注册表查询:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\<version>\Common\InstallRoot
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\<version>\Common\InstallRoot
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun
Office 2007: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\12.0\
Office 2010: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\
Office 2013: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\15.0\
Office 2016: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\16.0\
......
如何自动准确获取版本号和路径,且运算量很小?
谢谢!
作者: GNU 时间: 2017-2-25 13:28
- @echo off
- for /l %%i in (16 -1 12) do (
- reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\%%i.0\Common\InstallRoot 2>nul
- )
- pause
复制代码
作者: aries215 时间: 2017-2-25 14:00
本帖最后由 aries215 于 2017-2-27 15:54 编辑
回复 2# GNU
谢谢回复!运算量确实很小 :-)
Office16以后还会有新版本,我就是觉得限定为12~16不够,否则还不如手工指定省事。
我发现这样可以直接查询含版本号的注册表键:- @echo off
- SetLocal EnableDelayedExpansion
- for /f "delims=\ tokens=5,*" %%a in ('reg query HKLM\SOFTWARE\Microsoft\Office /f "." 2^>nul') do (
- set "_ver=%%~a"
- echo !_ver!
- )
- pause
复制代码
还有,/k 指定只在项名称中搜索,怎么用?
作者: aries215 时间: 2017-2-25 14:02
本帖最后由 aries215 于 2017-2-25 14:07 编辑
请问,2>nul 有什么作用?没看到差别哦
另外,在旧版Office基础上安装,印象中是删除旧版再安装吧?
作者: GNU 时间: 2017-2-25 16:10
回复 4# aries215
比如电脑上没有16.0这个版本的注册表键值,不使用 2>nul 的话会出现一个报错信息。
错误: 系统找不到指定的注册表项或值。
作者: GNU 时间: 2017-2-25 16:18
回复 3# aries215
C:\>reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office /v bathome.net /d test
操作成功完成。
C:\>reg query HKLM\SOFTWARE\Microsoft\Office /f "."
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office
bathome.net REG_SZ test
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\8.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\9.0
搜索结束: 找到 6 匹配。
C:\>reg query HKLM\SOFTWARE\Microsoft\Office /f "." /k
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\15.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\8.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\9.0
搜索结束: 找到 5 匹配。
作者: GNU 时间: 2017-2-25 16:19
Office16以后还会有新版本,我就是觉得限定为12~16不够,否则还不如手工指定省事。
你自己把 16 改大点呗
作者: aries215 时间: 2017-2-25 17:40
回复 6# GNU
这样演示很清楚,原来此命令要放在最后,怪不得我总出错。
你懂得很多,也好热心啊!谢谢!
作者: aries215 时间: 2017-2-25 17:48
回复 4# aries215
>nul 和 2>nul 需要叠加才完美吗?
单用 2>nul 能不能彻底屏蔽信息?
作者: GNU 时间: 2017-2-25 18:02
回复 8# aries215
参数出现的顺序通常在帮助手册里面都有说明。
C:\>reg query /?
REG QUERY KeyName [/v [ValueName] | /ve]
[/f Data [/k] [/d] [/c] [/e]] [/t Type] [/z] [/se Separator]
有的命令的参数放在什么位置都无所谓,但是有些命令参数必须按照某个顺序。
记不清楚的话,就严格按照帮助手册的来。
作者: GNU 时间: 2017-2-25 18:04
回复 9# aries215
>nul 屏蔽标准输出信息
2>nul 屏蔽标准出错信息
至于怎么用,要不要一起用,主要看你自己的需求。
作者: aries215 时间: 2017-2-25 18:14
本帖最后由 aries215 于 2017-2-25 18:19 编辑
回复 10# GNU
很有道理,尽量要按照帮助手册来使用。
谢谢!
作者: /zhqsystem/zhq 时间: 2017-2-25 23:00
标准安装下有效,纯净版无效,CMD原环境下命令行,支持NT5.2以上所有系统未精简版系统- Wmic Path Win32_Product Where 'Name like "Microsoft Office%"' get InstallLocation,Version /format:list
复制代码
作者: aries215 时间: 2017-2-26 00:20
本帖最后由 aries215 于 2017-2-26 00:33 编辑
回复 13# /zhqsystem/zhq
谢谢回复!
你说的“未精简版系统”,是指wmic要能正常运行吗?没问题,NT6各组件关联性挺强,绝大部分人不再苛求系统体积了。
不过,我运行你的命令,不管是补上1个% 还是删掉那个%,都提示没有可用实例。只能标准安装才有用?
Office 精简版,我在RAMOS上用,安装批处理都会写入上述注册表键值,代码的通用性很好啊。
Office2007 之后的,没有上述键值不能运行的,我没见过不写注册表的纯净版哦。
另外,我发现wmic的路径结果很难被 if 使用,显示没问题,真难用。
作者: GNU 时间: 2017-2-26 09:39
回复 14# aries215
test.bat- @echo off
- Wmic Path Win32_Product Where 'Name like "Microsoft Office%%"' get InstallLocation,Version /format:list
- pause
复制代码
我的Win7测试没有问题。注意放在bat文件里面执行的时候,需要两个百分号。
作者: GNU 时间: 2017-2-26 09:41
另外,我发现wmic的路径结果很难被 if 使用,显示没问题,真难用。
猜测你遇到的问题可能是wmic命令结果的行尾有特殊的不可见字符。
可以把你的代码发出来,我帮你看看如何处理。
作者: WHY 时间: 2017-2-26 10:57
- dir 'HKLM:\SOFTWARE\Microsoft\Office\*\Common\InstallRoot' | %{ ($_.Name -Split '\\')[-3];(gp $_.PSPath).'Path' }
复制代码
作者: WHY 时间: 2017-2-26 11:00
- @echo off
- set "key=HKLM\SOFTWARE\Microsoft\Office"
- for /f "delims=" %%i in ('reg query "%key%" ^| findstr "^HKEY_.*\\[0-9][0-9.]*$"') do (
- echo;%%~nxi
- for /f "tokens=1,2*" %%i in ('reg query "%%i\Common\InstallRoot"') do if "%%i" == "Path" echo;%%k
- )
- pause
复制代码
作者: aries215 时间: 2017-2-26 17:25
本帖最后由 aries215 于 2017-2-26 17:34 编辑
回复 15# GNU
奇哉怪也,我复制你的代码运行,仍然提示没有可用实例。运行一次Excel也不行。
我测试是在精简版系统,wmic功能完整;Office也是3in1绿化精简版,在无忧找的,但会写入很多注册表键值,包含1楼的项目。
作者: GNU 时间: 2017-2-26 17:51
回复 19# aries215
也许是因为 Wmic Path Win32_Product 不是查的注册表
作者: aries215 时间: 2017-2-26 17:54
本帖最后由 aries215 于 2017-2-26 18:06 编辑
回复 16# GNU
运行后,一共弹出3个CMD窗口,加了双引号就2个CMD窗口,路径怎么会不正确?谢谢!- @echo off
- SetLocal EnableDelayedExpansion
- for /f "skip=1 delims==" %%a in ('wmic process where name^="notepad.exe" get executablepath') do (
- set "_var=%%~a"
- echo,!_var!
- start "!_var!"
- )
- pause
复制代码
作者: GNU 时间: 2017-2-26 18:10
回复 21# aries215 - @echo off
- SetLocal EnableDelayedExpansion
- for /f "tokens=2 delims==" %%a in ('wmic process where name^="hash.exe" get executablepath /value ^| findstr "="') do (
- set "_var=%%~a"
- start "" "!_var:~0,-1!"
- goto :end
- )
-
- :end
- pause
复制代码
作者: aries215 时间: 2017-2-26 18:10
回复 18# WHY
此代码可用,挺高深的。
作者: aries215 时间: 2017-2-26 18:24
本帖最后由 aries215 于 2017-2-26 18:25 编辑
回复 22# GNU
真厉害!
wmic 很多结果都要用 findstr 比较好吗?
我还有很多东西要学习!
作者: aries215 时间: 2017-2-26 18:54
本帖最后由 aries215 于 2017-2-26 19:52 编辑
回复 22# GNU
好吧,问题基本解决,非常感谢楼上各位热心帮助。我继续学习。
作者: GNU 时间: 2017-2-26 20:56
回复 24# aries215
我习惯给wmic加上/value参数,这样得到的结果都是 key=value 这种格式,方便后续的处理。
作者: aries215 时间: 2017-2-26 21:09
回复 26# GNU
原来如此,谢谢
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |