Board logo

标题: [注册表类] [已解]如何将注册表中查到符合指定条件的注册表键路径赋给变量? [打印本页]

作者: huyou96    时间: 2016-10-21 19:21     标题: [已解]如何将注册表中查到符合指定条件的注册表键路径赋给变量?

本帖最后由 huyou96 于 2016-10-22 11:46 编辑

在注册表里查找"HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID"所有子项中
默认值为空(默认值未设置)且含有“System.IsPinnedToNameSpaceTree”值的注册表键,
并把该注册表键的全路径
即HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}形式的字符串值
赋给一个变量?
作者: huyou96    时间: 2016-10-21 19:22

新手求教:

"HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID"的所有子项中
俩条件:
1. 既默认值为空(默认值未设置)
2. 又含有“System.IsPinnedToNameSpaceTree”值
符合条件的查询结果的注册表路径,即HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}形式的字符串值,赋给变量并echo显示出来,这个批处理怎么写?
作者: aa77dd@163.com    时间: 2016-10-21 20:20

本帖最后由 aa77dd@163.com 于 2016-10-21 20:36 编辑

回复 2# huyou96

测试于 WIN7 64BIT, 在 HKLM 下能找到如此条件的结果, 在 HKCU 下未找到结果, 代码中还是改成了 HKCU (HKEY_CURRENT_USER) 给你
  1. @echo off & setlocal enableDelayedExpansion
  2. chcp 437
  3. mode 200
  4. for /f delims^= %%a in (^
  5. 'reg query HKCU\SOFTWARE\Classes\CLSID /s /v "System.IsPinnedToNameSpaceTree" ^
  6. | findstr /r /i /c:"HKEY_CURRENT_USER\\SOFTWARE\\Classes\\CLSID\\{........-....-....-....-............}"'
  7. ) do (
  8.     >nul (reg query "%%a" /ve | find /i "(Default)    REG_SZ    (value not set)") && (
  9.         for /f tokens^=1-5delims^=\ %%A in ("%%a") do (
  10.             set "key=%%A\%%B\%%C\%%D\%%E"
  11.             echo;key=!key!
  12.         )
  13.     )
  14. )
  15. pause
  16. exit /b
复制代码

作者: huyou96    时间: 2016-10-21 20:43

本帖最后由 huyou96 于 2016-10-21 22:55 编辑

回复 3# aa77dd@163.com

谢谢大虾!太牛啦!!!
这么短时间内就把它搞掂,实在是炉火纯青的厚底子才能做到!受教啦!!!


我在 windows 10 运行结果如下:

HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}
HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}
请按任意键继续. . .

C:\WINDOWS\system32>

现在我又想多加一个条件,上述俩结果都符合我开贴设置的俩条件,
第一个还多含有SortOrderIndex值共仨值,第二个只有默认值跟System.IsPinnedToNameSpaceTree值共俩值,
但我还想要结果再多加一个筛选条件:该注册表键里仅仅含有这两个值,多出其他键值者将被排除,大虾可否再帮我筛选一下?
(这样的话就可把第一个结果刨除,只筛选出第二个来了。结果筛出唯一符合条件的一个。)

大虾真得很牛!在结果中筛选不容易,这里是我直接查询两个键的结果(很多行啊,Win10就是这样,OneDrive和库都加进了资源管理器,都符合条件,但OneDrive的类在这个项这里多出很多,而库却很“单纯”仅有俩值):


C:\WINDOWS\system32>reg query "HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}"

HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}
    (Default)    REG_SZ    OneDrive
    System.IsPinnedToNameSpaceTree    REG_DWORD    0x1
    SortOrderIndex    REG_DWORD    0x42

HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}\DefaultIcon
HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}\InProcServer32
HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}\Instance
HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}\ShellFolder

C:\WINDOWS\system32>reg query "HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}"

HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}
    System.IsPinnedToNameSpaceTree    REG_DWORD    0x0


C:\WINDOWS\system32>
作者: huyou96    时间: 2016-10-21 21:04

本帖最后由 huyou96 于 2016-10-21 21:09 编辑

附加说明一下,我要筛出该键不是用于骇客做坏事的。

看一下这个键值有什么用处就知道了:

HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}键下含有如下键值:

值    System.IsPinnedToNameSpaceTree
类型  REG_DWORD
数据  0=文件资源管理器导航窗格不显示库,1=文件资源管理器导航窗格显示库
默认  0x0(即系统默认情形下文件资源管理器导航窗格不显示库,但似乎系统有bug,我这里左侧导航窗仍显示了“库”)
作者: aa77dd@163.com    时间: 2016-10-21 21:13

本帖最后由 aa77dd@163.com 于 2016-10-21 22:04 编辑

回复 4# huyou96

下面代码中筛选规则不是很严谨的, 但没有人为设置特别的情况, 应该是可用的
  1. @echo off & setlocal enableDelayedExpansion
  2. chcp 437
  3. mode 200
  4. for /f delims^= %%a in (^
  5. 'reg query HKCU\SOFTWARE\Classes\CLSID /s /v "System.IsPinnedToNameSpaceTree" ^
  6. | findstr /r /i /c:"HKEY_CURRENT_USER\\SOFTWARE\\Classes\\CLSID\\{........-....-....-....-............}"'
  7. ) do (
  8.    >nul  (reg query "%%a" | findstr /v /r "^$" | findstr /v "System.IsPinnedToNameSpaceTree HKEY_CURRENT_USER") && echo;exclude || (
  9.         >nul (reg query "%%a" /ve | find /i "(Default)    REG_SZ    (value not set)") && (
  10.             for /f tokens^=1-5delims^=\ %%A in ("%%a") do (
  11.                 set "key=%%A\%%B\%%C\%%D\%%E"
  12.                 echo;key=!key!
  13.             )
  14.         )
  15.     )
  16. )
  17. pause
  18. exit /b
复制代码

作者: huyou96    时间: 2016-10-21 21:46

大虾你好!我运行了一下,结果如下:

exclude
exclude
Press any key to continue . . .

C:\WINDOWS\system32>

是否  (echo;exclude) 这个没写全?“exclude” 在哪儿?
作者: aa77dd@163.com    时间: 2016-10-21 22:02

回复 7# huyou96

确实有问题

因为没有过滤空行, 我改了, 并且又测试了下
作者: huyou96    时间: 2016-10-21 22:17

本帖最后由 huyou96 于 2016-10-21 22:19 编辑
回复  huyou96

确实有问题

因为没有过滤空行, 我改了, 并且又测试了下
aa77dd@163.com 发表于 2016-10-21 22:02



这次我这里跑的结果如下:

exclude
key=HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}
Press any key to continue . . .

C:\WINDOWS\system32>

看到HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}啦,但还有多余的一行
作者: aa77dd@163.com    时间: 2016-10-21 22:32

回复 9# huyou96

第 10 行改成
  1. >nul  (reg query "%%a" | findstr /v /r "^$" | findstr /v "System.IsPinnedToNameSpaceTree HKEY_CURRENT_USER")  || (
复制代码

作者: huyou96    时间: 2016-10-21 22:47

回复  huyou96

第 10 行改成
aa77dd@163.com 发表于 2016-10-21 22:32


OK! 这次行了,第十行改了后,结果如下:

key=HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{031E4825-7B94-4dc3-B131-E946B44C8DD5}
Press any key to continue . . .

C:\WINDOWS\system32>

谢谢大虾!非常感谢!真是牛啊。祝晚安!
作者: huyou96    时间: 2016-10-21 23:18

回复 11# huyou96

一时不当心就“引用”了,该处是该“回复的。谢谢版主!
作者: WHY    时间: 2016-10-22 16:55

本帖最后由 WHY 于 2016-10-23 11:17 编辑

PowerShell
  1. $key = dir 'HKCU:\Software\Classes\CLSID';
  2. ForEach ($subkey In $key) {
  3.     $item = get-ItemProperty Registry::$($subkey.Name);
  4.     if($item.'(Default)' -eq '' -or $item.'(Default)' -eq $null -and $item.'System.IsPinnedToNameSpaceTree' -ne $null) {
  5.         $subkey.Name
  6.     }
  7. }
复制代码
搞错了,'System.IsPinnedToNameSpaceTree' 是注册表值,不是注册表数据
作者: huyou96    时间: 2016-10-22 17:16

本帖最后由 huyou96 于 2016-10-22 17:18 编辑

回复 13# WHY

讃!谢!(我弹尽粮绝了,级别也太低,没法评分了,否则会给予评分的……)
哈哈哈,还是PS强大啊,比起批处理来看似更简易好懂,实现起来也看似更容易。

对版主说的话:
请版主不要删楼上啊,虽然这位大虾贴错了论坛,但代码非常漂亮,具有启发啊。
殊途同归,无论PowerShell脚本还是批处理脚本无论黑猫白猫只要能达到目的就是好猫!




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