标题: [技术讨论] 还有没有比这更好的批处理读取开机启动项注册表 [打印本页]
作者: /zhqsystem/zhq 时间: 2015-7-8 02:49 标题: 还有没有比这更好的批处理读取开机启动项注册表
- @echo off&color 0e
- echo/&echo 读取开机启动项代码
-
- reg query "hklm\software\wow6432node">nul 2>nul&&(echo/&echo 读取系统64位开机启动项
- for /f "tokens=1,* delims=(" %%i in ('reg query "hklm\software\wow6432node\microsoft\windows\currentversion\run" /z') do (
- for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
- if "%%k"=="1" echo=字符串值: %%~dpnxl
- if "%%k"=="3" echo=二进制值: %%~dpnxl
- if "%%k"=="4" echo=dword[32-bit]值: %%~dpnxl
- if "%%k"=="11" echo=dword[64-bit]值: %%~dpnxl
- if "%%k"=="7" echo=多字符串值: %%~dpnxl
- if "%%k"=="2" echo=可扩充字符串值: %%~dpnxl
- ))
- )
- echo/&echo 读取系统开机启动项
- for /f "tokens=1,* delims=(" %%i in ('reg query "hklm\software\microsoft\windows\currentversion\run" /z') do (
- for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
- if "%%k"=="1" echo=字符串值: %%~dpnxl
- if "%%k"=="3" echo=二进制值: %%~dpnxl
- if "%%k"=="4" echo=dword[32-bit]值: %%~dpnxl
- if "%%k"=="11" echo=dword[64-bit]值: %%~dpnxl
- if "%%k"=="7" echo=多字符串值: %%~dpnxl
- if "%%k"=="2" echo=可扩充字符串值: %%~dpnxl
- ))
- echo/&echo 读取用户开机启动项
- for /f "tokens=1,* delims=(" %%i in ('reg query "hkcu\software\microsoft\windows\currentversion\run" /z') do (
- for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
- if "%%k"=="1" echo=字符串值: %%~dpnxl
- if "%%k"=="3" echo=二进制值: %%~dpnxl
- if "%%k"=="4" echo=dword[32-bit]值: %%~dpnxl
- if "%%k"=="11" echo=dword[64-bit]值: %%~dpnxl
- if "%%k"=="7" echo=多字符串值: %%~dpnxl
- if "%%k"=="2" echo=可扩充字符串值: %%~dpnxl
- ))
- pause
复制代码
另外如何提取前边的值名,不用延迟变量,提取一晚了没提取出来,关键是值名称包含空格(多少个空格未知)
作者: DAIC 时间: 2015-7-8 09:25
不要让那6个if命令每次都执行,试试这样:- reg query "hklm\software\wow6432node">nul 2>nul&&(
- echo/&echo 读取系统64位开机启动项
- for /f "tokens=1,* delims=(" %%i in ('reg query "hklm\software\wow6432node\microsoft\windows\currentversion\run" /z') do (
- for /f "tokens=1,* delims=) " %%k in ('echo=%%j') do (
- if "%%k"=="1" (
- echo=字符串值: %%~dpnxl
- ) else if "%%k"=="3" (
- echo=二进制值: %%~dpnxl
- ) else if "%%k"=="4" (
- echo=dword[32-bit]值: %%~dpnxl
- ) else if "%%k"=="11" (
- echo=dword[64-bit]值: %%~dpnxl
- ) else if "%%k"=="7" (
- echo=多字符串值: %%~dpnxl
- ) else if "%%k"=="2" (
- echo=可扩充字符串值: %%~dpnxl
- )
- )
- )
- )
复制代码
作者: /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 编辑
- @echo off
- ::实际改为读取注册表
- (for /f "delims=" %%a in (测试.txt) do (
- for %%b in (%%a) do if "%%b" equ "REG_SZ" (
- echo;^|#
- ) else if "%%b" equ "REG_DWORD" (
- echo;^|#
- ) else if "%%b" equ "REG_BINARY" (
- echo;^|#
- ) else if "%%b" equ "REG_MULTI_SZ" (
- echo;^|#
- ) else if "%%b" equ "REG_EXPAND_SZ" (
- echo;^|#
- ) else if "%%b" equ "REG_QWORD" (
- echo;^|#
- ) else (set /p=%%b <nul)
- echo;^|@
- ))>"%temp%\$"
- for /f "tokens=1* delims=^|" %%b in ('findstr "|#$" "%temp%\$"') do echo;%%b
- pause
复制代码
作者: pcl_test 时间: 2015-7-11 11:57
本帖最后由 pcl_test 于 2015-7-11 12:18 编辑
- 1>1/* :
- @echo off
- ::实际改为读取注册表
- (for /f "delims=" %%a in (测试.txt) do @echo;%%a)|cscript -nologo -e:jscript "%~f0"
- pause&exit /b
- */
- var txt = "";
- while(!WScript.StdIn.AtEndOfStream){
- var str = WScript.StdIn.ReadLine().replace(/\s+(REG_SZ|REG_MULTI_SZ|REG_BINARY|REG_DWORD|REG_QWORD|REG_EXPAND_SZ).*?$/,'');
- txt+=str+"\r\n";
- }
- 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/* :
- @echo off
- ::获取IE相关的注册表值项的名称
- set "readREG='reg query "HKCU\Software\Microsoft\Internet Explorer\Main"'"
- (for /f "delims=" %%a in (%readREG%) do @echo;%%a)|cscript -nologo -e:jscript "%~f0"
- pause&exit /b
- */
- var txt = "";
- while(!WScript.StdIn.AtEndOfStream){
- var str1 = WScript.StdIn.ReadLine();
- var str2 = str1.replace(/\s+(REG_SZ|REG_MULTI_SZ|REG_BINARY|REG_DWORD|REG_QWORD|REG_EXPAND_SZ).*?$/,'');
- if (str1!=str2)txt+=str2+"\r\n";
- }
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |