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

[技术讨论] 还有没有比这更好的批处理读取开机启动项注册表

  1. @echo off&color 0e
  2. echo/&echo 读取开机启动项代码
  3. reg query "hklm\software\wow6432node">nul 2>nul&&(echo/&echo 读取系统64位开机启动项
  4. for /f "tokens=1,* delims=(" %%i in ('reg query "hklm\software\wow6432node\microsoft\windows\currentversion\run" /z') do (
  5. for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
  6. if "%%k"=="1" echo=字符串值: %%~dpnxl
  7. if "%%k"=="3" echo=二进制值: %%~dpnxl
  8. if "%%k"=="4" echo=dword[32-bit]值: %%~dpnxl
  9. if "%%k"=="11" echo=dword[64-bit]值: %%~dpnxl
  10. if "%%k"=="7" echo=多字符串值: %%~dpnxl
  11. if "%%k"=="2" echo=可扩充字符串值: %%~dpnxl
  12. ))
  13. )
  14. echo/&echo 读取系统开机启动项
  15. for /f "tokens=1,* delims=(" %%i in ('reg query "hklm\software\microsoft\windows\currentversion\run" /z') do (
  16. for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
  17. if "%%k"=="1" echo=字符串值: %%~dpnxl
  18. if "%%k"=="3" echo=二进制值: %%~dpnxl
  19. if "%%k"=="4" echo=dword[32-bit]值: %%~dpnxl
  20. if "%%k"=="11" echo=dword[64-bit]值: %%~dpnxl
  21. if "%%k"=="7" echo=多字符串值: %%~dpnxl
  22. if "%%k"=="2" echo=可扩充字符串值: %%~dpnxl
  23. ))
  24. echo/&echo 读取用户开机启动项
  25. for /f "tokens=1,* delims=(" %%i in ('reg query "hkcu\software\microsoft\windows\currentversion\run" /z') do (
  26. for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
  27. if "%%k"=="1" echo=字符串值: %%~dpnxl
  28. if "%%k"=="3" echo=二进制值: %%~dpnxl
  29. if "%%k"=="4" echo=dword[32-bit]值: %%~dpnxl
  30. if "%%k"=="11" echo=dword[64-bit]值: %%~dpnxl
  31. if "%%k"=="7" echo=多字符串值: %%~dpnxl
  32. if "%%k"=="2" echo=可扩充字符串值: %%~dpnxl
  33. ))
  34. pause
复制代码
另外如何提取前边的值名,不用延迟变量,提取一晚了没提取出来,关键是值名称包含空格(多少个空格未知)

不要让那6个if命令每次都执行,试试这样:
  1. reg query "hklm\software\wow6432node">nul 2>nul&&(
  2. echo/&echo 读取系统64位开机启动项
  3.     for /f "tokens=1,* delims=(" %%i in ('reg query "hklm\software\wow6432node\microsoft\windows\currentversion\run" /z') do (
  4.         for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
  5.             if "%%k"=="1" (
  6.                 echo=字符串值: %%~dpnxl
  7.             ) else if "%%k"=="3" (
  8.                 echo=二进制值: %%~dpnxl
  9.             ) else if "%%k"=="4" (
  10.                 echo=dword[32-bit]值: %%~dpnxl
  11.             ) else if "%%k"=="11" (
  12.                 echo=dword[64-bit]值: %%~dpnxl
  13.             ) else if "%%k"=="7" (
  14.                 echo=多字符串值: %%~dpnxl
  15.             ) else if "%%k"=="2" (
  16.                 echo=可扩充字符串值: %%~dpnxl
  17.             )
  18.         )
  19.     )
  20. )
复制代码

TOP

回复 2# DAIC


多谢坛友指导,真没想到用多重判断
其实我只是完善下以前大神的各种代码达到更好的效果

TOP

另外如何提取前边的值名

请举例说明需要提前哪一步分

TOP

回复 4# DAIC

Energy Management    REG_SZ    C:\Program Files (x86)\Lenovo\Energy Manageme
1 3gr a    REG_SZ "C:\Program Files\qq\"
Skytel    REG_SZ    C:\Program Files\Realtek\Audio\HDA\Skytel.exe
这只是例子非正常标准环境
只提取REG_SZ前边的内容,在不用第三方和延迟变量情况下提取,红色标注为要提取的内容拆分了N次居然没有成功

TOP

不要使用"hklm\software\wow6432node"来检测32和64,看到过一些绿色软件会不管什么系统都往那里写注册表。
还是用系统变量来检测吧。

TOP

回复 6# 9zhmke
只是用的一种而已我写的一般是同时检测如果达不到要求就会自动删除注册表信息的主项和对应文件夹这个有没有此项都无所谓,只是会多余显示64位开机启动项这个名称

TOP

本帖最后由 pcl_test 于 2015-7-11 12:28 编辑
  1. @echo off
  2. ::实际改为读取注册表
  3. (for /f "delims=" %%a in (测试.txt) do (
  4.       for %%b in (%%a) do if "%%b" equ "REG_SZ" (
  5.             echo;^|#
  6.       ) else if "%%b" equ "REG_DWORD" (
  7.             echo;^|#
  8.       ) else if "%%b" equ "REG_BINARY" (
  9.             echo;^|#
  10.       ) else if "%%b" equ "REG_MULTI_SZ" (
  11.             echo;^|#
  12.       ) else if "%%b" equ "REG_EXPAND_SZ" (
  13.             echo;^|#
  14.       ) else if "%%b" equ "REG_QWORD" (
  15.             echo;^|#
  16.       ) else (set /p=%%b <nul)
  17. echo;^|@
  18. ))>"%temp%\$"
  19. for /f "tokens=1* delims=^|" %%b in ('findstr "|#$" "%temp%\$"') do echo;%%b
  20. pause
复制代码

TOP

本帖最后由 pcl_test 于 2015-7-11 12:18 编辑
  1. 1>1/* :
  2. @echo off
  3. ::实际改为读取注册表
  4. (for /f "delims=" %%a in (测试.txt) do @echo;%%a)|cscript -nologo -e:jscript "%~f0"
  5. pause&exit /b
  6. */
  7. var txt = "";
  8. while(!WScript.StdIn.AtEndOfStream){
  9. var str = WScript.StdIn.ReadLine().replace(/\s+(REG_SZ|REG_MULTI_SZ|REG_BINARY|REG_DWORD|REG_QWORD|REG_EXPAND_SZ).*?$/,'');
  10. txt+=str+"\r\n";
  11. }
  12. WSH.Echo(txt);
复制代码

TOP

回复 9# pcl_test

依然感谢PCL大神解答,不过这样会多出无用的临时文件,已经很少用临时文件信息来读取了(避开到不创建任何一个临时的文件),不过大神,这是不是VBS,在正常批处理中没见过这些while(!WScript.StdIn.AtEndOfStream){.........},对VBS一点都不懂

TOP

回复 10# /zhqsystem/zhq
不用临时文件也是可以,然你在要求中提出不要延迟变量,想来也只好用临时文件了,另一种是采用bat+js混编的方式,在不借助第三方的情况下也是极好的,保存为bat文件运行,要求改的也只是bat代码部分即可

TOP

回复 11# pcl_test


   只要不借助延迟变量,第三方,临时文件,就是好代码,诚恳请大神发下代码,虽然看不懂不过这个键值名称提取真的很重要,微软那么多zhuan家居然没考虑到注册表提取会这么麻烦

TOP

本帖最后由 pcl_test 于 2015-7-12 10:10 编辑

回复 12# /zhqsystem/zhq
举个栗子
  1. 1>1/* :
  2. @echo off
  3. ::获取IE相关的注册表值项的名称
  4. set "readREG='reg query "HKCU\Software\Microsoft\Internet Explorer\Main"'"
  5. (for /f "delims=" %%a in (%readREG%) do @echo;%%a)|cscript -nologo -e:jscript "%~f0"
  6. pause&exit /b
  7. */
  8. var txt = "";
  9. while(!WScript.StdIn.AtEndOfStream){
  10. var str1 = WScript.StdIn.ReadLine();
  11. var str2 = str1.replace(/\s+(REG_SZ|REG_MULTI_SZ|REG_BINARY|REG_DWORD|REG_QWORD|REG_EXPAND_SZ).*?$/,'');
  12. if (str1!=str2)txt+=str2+"\r\n";
  13. }
  14. WSH.Echo(txt);
复制代码
1

评分人数

TOP

回复 13# pcl_test

我倒.例子在5楼了

TOP

本帖最后由 pcl_test 于 2015-7-12 10:03 编辑

回复 14# /zhqsystem/zhq

我晕,5楼没有主项,只是你提取出来假设的值项例子,看来你还没明白怎么套用代码

TOP

返回列表