[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[注册表类] [已处理]获取word打开历史的批处理为什么执行第一次错误 第2次正确呢?

本帖最后由 missll 于 2012-11-16 17:23 编辑

我想在用户权限下获取Microsoft Office版本
是读取注册表键值 HKEY_CURRENT_USER\Software\Microsoft\Office\12.0 位置, 12是office 007
代码一下 :
  1. @echo off
  2. set office=HKEY_CURRENT_USER\Software\Microsoft\Office
  3. (reg query %office% | find "11.0" || reg query %office% | find "12.0" || reg query %office% | find "14.0")>%TEMP%\6c70ef5709acfbb79de47c27863d64eb
  4. for /f %%a in ('type %TEMP%\6c70ef5709acfbb79de47c27863d64eb') do (
  5. set ofver=%%a
  6. echo %ofver:~-4%)
复制代码
执行结果:
  1. Microsoft Windows [版本 5.2.3790]
  2. (C) 版权所有 1985-2003 Microsoft Corp.
  3. C:\Documents and Settings\Administrator>e:\1.bat
  4. ~-4
  5. C:\Documents and Settings\Administrator>e:\1.bat
  6. 12.0
  7. C:\Documents and Settings\Administrator>
复制代码
从以上结果可以看出  第一次执行的时候  %ofver:~-4% 获取值是错误的,第2次执行显示了正确的键值  但是我不明白这是为什么 ?

测试环境  win2k3 r2
我感觉写的很罗嗦  或者谁能给出更简单的代码呢?
花开不问月,不语笑红尘.

更新了代码 找出问题出在%ofver:~-4%上 但是不知道原因。 求解。。。
花开不问月,不语笑红尘.

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. del %TEMP%\6c70ef5709acfbb79de47c27863d64eb
  4. set office=HKEY_CURRENT_USER\Software\Microsoft\Office
  5. reg query %office% | findstr  "1[124].0" >%TEMP%\6c70ef5709acfbb79de47c27863d64eb
  6. for /f %%a in ('type %TEMP%\6c70ef5709acfbb79de47c27863d64eb') do (
  7.     set ofver=%%a
  8.     echo --------------Microsoft Office Word--------------------
  9.     reg query "%office%\!ofver:~-4!\Word\File MRU"
  10.     echo --------------Microsoft Office Excel-------------------
  11.     reg query "%office%\!ofver:~-4!\Excel\File MRU"
  12.     echo --------------Microsoft Office PowerPoint--------------
  13.     reg query "%office%\!ofver:~-4!\PowerPoint\File MRU"
  14. )
复制代码

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set office=HKEY_CURRENT_USER\Software\Microsoft\Office
  4. for /f %%a in ('reg query %office% ^| findstr  "1[124].0"') do (
  5.     set ofver=%%a
  6.     echo --------------Microsoft Office Word--------------------
  7.     reg query "%office%\!ofver:~-4!\Word\File MRU"
  8.     echo --------------Microsoft Office Excel-------------------
  9.     reg query "%office%\!ofver:~-4!\Excel\File MRU"
  10.     echo --------------Microsoft Office PowerPoint--------------
  11.     reg query "%office%\!ofver:~-4!\PowerPoint\File MRU"
  12. )
复制代码

TOP

for /f %%a in ('type %TEMP%\6c70ef5709acfbb79de47c27863d64eb') do (
set ofver=%%a
echo --------------Microsoft Office Word--------------------
reg query "%office%\%ofver:~-4%\Word\File MRU" 2>nul
echo --------------Microsoft Office Excel-------------------
reg query "%office%\%ofver:~-4%\Excel\File MRU" 2>nul
echo --------------Microsoft Office PowerPoint--------------
reg query "%office%\%ofver:~-4%\PowerPoint\File MRU" 2>nul)

因为每条命令在执行之前,变量就会被展开。以上几行都是属于一个 for 命令里的,也就是一条 for 命令。

在这条 for 命令之前并没有设置 ofver 变量,所以查不到结果。而当你第二次运行批处理时,因为第一次运行的 ofver 变量没有被清除,所以能够得到结果。

改成:
@echo off
setlocal enabledelayedexpansion
del %TEMP%\6c70ef5709acfbb79de47c27863d64eb >nul 2>nul
set office=HKEY_CURRENT_USER\Software\Microsoft\Office
(reg query %office% | find "11.0" || reg query %office% | find "12.0" || reg query %office% | find "14.0")>>%TEMP%\6c70ef5709acfbb79de47c27863d64eb
for /f %%a in ('type %TEMP%\6c70ef5709acfbb79de47c27863d64eb') do (
set ofver=%%a
echo --------------Microsoft Office Word--------------------
reg query "%office%\!ofver:~-4!\Word\File MRU" 2>nul
echo --------------Microsoft Office Excel-------------------
reg query "%office%\!ofver:~-4!\Excel\File MRU" 2>nul
echo --------------Microsoft Office PowerPoint--------------
reg query "%office%\!ofver:~-4!\PowerPoint\File MRU" 2>nul)


或者:
  1. @echo off
  2. set office=HKEY_CURRENT_USER\Software\Microsoft\Office
  3. for /f "tokens=*" %%a in (' reg query %office% ^| findstr "1[124]\.0" ') do (
  4.    
  5.     echo --------------Microsoft Office Word--------------------
  6.     reg query "%office%\%%~nxa\Word\File MRU"
  7.    
  8.     echo --------------Microsoft Office Excel-------------------
  9.     reg query "%office%\%%~nxa\Excel\File MRU"
  10.    
  11.     echo --------------Microsoft Office PowerPoint--------------
  12.     reg query "%office%\%%~nxa\PowerPoint\File MRU"
  13.    
  14. ) 2>nul
  15. pause
复制代码

TOP

本帖最后由 missll 于 2012-11-16 17:26 编辑

感谢大家回复  我对变量延迟不太了解 我也找过文章看过  但没消化。。

我自己修改了一下:
  1. @echo off
  2. (reg query HKEY_CURRENT_USER\Software\Microsoft\Office | find "11.0" || reg query HKEY_CURRENT_USER\Software\Microsoft\Office | find "12.0" || reg query HKEY_CURRENT_USER\Software\Microsoft\Office | find "14.0")>%TEMP%\6c70ef5709acfbb79de47c27863d64eb
  3. for /f "tokens=1* delims=" %%a in ('type %TEMP%\6c70ef5709acfbb79de47c27863d64eb') do (
  4.     echo --------------Microsoft Office Word--------------------
  5. reg query "%%a\Word\File MRU" 2>nul
  6.     echo --------------Microsoft Office PowerPoint--------------
  7. reg query "%%a\PowerPoint\File MRU" 2>nul
  8.     echo --------------Microsoft Office Excel-------------------
  9. reg query "%%a\Excel\File MRU" 2>nul
  10. )
复制代码
这样也可以的。  最后还是感谢大家回复~~~~
花开不问月,不语笑红尘.

TOP

本帖最后由 missll 于 2012-11-16 17:29 编辑

回复 5# tmplinshi


    感谢回复,谢谢讲解, 我再看看findstr的帮助 学习下。
花开不问月,不语笑红尘.

TOP

回复 4# BAT-VBS


    感谢~~~~ 再学习下。
花开不问月,不语笑红尘.

TOP

返回列表