Board logo

标题: [技术讨论] 还有没有比这更好的批处理读取开机启动项注册表 [打印本页]

作者: /zhqsystem/zhq    时间: 2015-7-8 02:49     标题: 还有没有比这更好的批处理读取开机启动项注册表

  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
复制代码
另外如何提取前边的值名,不用延迟变量,提取一晚了没提取出来,关键是值名称包含空格(多少个空格未知)
作者: DAIC    时间: 2015-7-8 09:25

不要让那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. )
复制代码

作者: /zhqsystem/zhq    时间: 2015-7-8 21:36

回复 2# DAIC


多谢坛友指导,真没想到用多重判断
其实我只是完善下以前大神的各种代码达到更好的效果
作者: DAIC    时间: 2015-7-9 09:29

另外如何提取前边的值名

请举例说明需要提前哪一步分
作者: /zhqsystem/zhq    时间: 2015-7-9 22:00

回复 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次居然没有成功
作者: 9zhmke    时间: 2015-7-10 20:26

不要使用"hklm\software\wow6432node"来检测32和64,看到过一些绿色软件会不管什么系统都往那里写注册表。
还是用系统变量来检测吧。
作者: /zhqsystem/zhq    时间: 2015-7-10 22:43

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

本帖最后由 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
复制代码

作者: pcl_test    时间: 2015-7-11 11:57

本帖最后由 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);
复制代码

作者: /zhqsystem/zhq    时间: 2015-7-12 00:08

回复 9# pcl_test

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

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

回复 11# pcl_test


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

本帖最后由 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);
复制代码

作者: /zhqsystem/zhq    时间: 2015-7-12 01:10

回复 13# pcl_test

我倒.例子在5楼了
作者: pcl_test    时间: 2015-7-12 01:19

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

回复 14# /zhqsystem/zhq

我晕,5楼没有主项,只是你提取出来假设的值项例子,看来你还没明白怎么套用代码
作者: /zhqsystem/zhq    时间: 2015-7-12 01:23

本帖最后由 /zhqsystem/zhq 于 2015-7-12 01:24 编辑

回复 15# pcl_test

hklm\software\microsoft\windows\currentversion\run
hkcu\software\microsoft\windows\currentversion\run
hklm\software\wow6432node\microsoft\windows\currentversion\run
任意选择一个,我也做伸手党,实在是办法用尽了也没弄出来
作者: pcl_test    时间: 2015-7-12 01:28

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

回复 16# /zhqsystem/zhq


    自行参考13楼代码修改主项
作者: DAIC    时间: 2015-7-12 12:39

回复 16# /zhqsystem/zhq


    我可以提供现成的代码,只要1000¥,价格公道,童叟无欺。
作者: czjt1234    时间: 2015-7-12 16:21

又当bat又当js






欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2