shell - 需要使用批处理/Windows 命令行枚举未知的注册表项

标签 shell command key registry cycle

我有一个任务要枚举

中的所有注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render

(子项名称未知,因为它们在每台 PC 上都是可变的)并检查每个子项的特定值,例如

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Reder\{45be4e8b-f46c-4c2d-a1ff-ccae63ad5f80}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Reder\{8997a378-f558-4435-8134-b37565604f54}
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Reder\{a7472931-1ee7-4561-9df3-6efacd010613}

并检查每个属性中的属性子项值{a45c254e-df1c-4efd-8020-67d146a850e0},2

如果它等于某些文本,我需要更改父键中的值 DeviceState

我所做的很平常,并且多次为我工作 - 我用于 /f:

@echo off
Setlocal EnableDelayedExpansion
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render" > c:\temp\reg.txt
for /f %%a in ('find /c /v "" ^< "c:\temp\reg.txt"') do set count=%%a
echo Number of lines: %count%
for /l %%i in (2,1,%count%) do (
echo Current line is: %%i
for /f "usebackq tokens=2 delims=]" %%b in ('find /n /v "" ^< "c:\temp\reg.txt" ^| findstr "^\[%%i\]"') do set test=%%b
echo %test%

set regstring=%test%^\Properties
echo %regstring%
pause
for /f "tokens=3*" %%c in ('reg query %regstring% ^/v "{a45c254e-df1c-4efd-8020-67d146a850e0},2"') do set value=%%c %%d
echo %value%
)

那行有什么奇怪的

for /f "usebackq tokens=2 delims=]" %%b in ('find /n /v "" ^< "c:\temp\reg.txt" ^| findstr "^\[%%i\]"') do set test=%%b

不给“test”变量赋值。 同时如果我把

for /f "usebackq tokens=2 delims=]" %%b in ('find /n /v "" ^< "c:\temp\reg.txt" ^| findstr "^\[%%i\]"') do echo %%b

它将 %%b 输出到屏幕。

我完全迷失了试图理解为什么它不将值传递给变量。

我尝试了一个更简单的代码,没有导出到 txt 文件并稍后从中读取,但它都不起作用。它会将 %%a 回显到屏幕,但不会为“key”变量分配值:

@echo off
Setlocal EnableDelayedExpansion
for /f "usebackq delims=" %%a in (`reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"`)  do (
echo %%a
pause
set key=%%a
echo %key%
for /f "tokens=3*" %%c in ('reg query %key% ^/v "{a45c254e-df1c-4efd-8020-67d146a850e0},2"') do set value=%%c %%d
echo %value% 
)

您能给点建议吗?

最佳答案

好的,我自己搞定了,也许有人会发现它有用。它枚举子项并检查每个子项中的值。每完成一次,它都会将该值与 Dell 的已知值进行比较并输出信息。

在命令中:

@echo off
Setlocal EnableDelayedExpansion
for /f "usebackq delims=" %%a in (`reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"`)  do (
set key=%%a^\Properties
echo !key!
for /f "tokens=3*" %%c in ('reg query !key! ^/v "{a45c254e-df1c-4efd-8020-67d146a850e0},2"') do set value=%%c %%d
echo !value!
)
pause

在 powershell 中:

$alldevices = Get-ChildItem -Path hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render | select -ExpandProperty name
foreach($device in $alldevices)
{
    $dkey = $device -split 'HKEY_LOCAL_MACHINE',2 | select -last 1
    $devitem = "HKLM:"+$dkey+"\Properties"
    $i = Get-ItemProperty $devitem -Name "{a45c254e-df1c-4efd-8020-67d146a850e0},2" | select -ExpandProperty "{a45c254e-df1c-4efd-8020-67d146a850e0},2"
    if ($i -like '*DELL U*') {
        "Dell Displays found:"
        $i
        #The below throws access denied errors
        #$editkey = "HKLM:"+$dkey
        #Set-ItemProperty -Path $editkey -Name DeviceState -Value 268435457
        #Alternative
        $tmpFileFullPath = [System.io.Path]::getTempFileName()
        "Windows Registry Editor Version 5.00" | Out-File -FilePath  $tmpFileFullPath -Append
        " " | Out-File -FilePath  $tmpFileFullPath -Append
        "[$device]" | Out-File -FilePath  $tmpFileFullPath -Append
        #10000001 disables but makes it visible in GUI | 00000004 disables and prevents it from being visible in Recording Devices GUI
        "`"DeviceState`"=dword:10000001" | Out-File -FilePath  $tmpFileFullPath -Append
        " " | Out-File -FilePath  $tmpFileFullPath -Append
        regedit.exe /S $tmpFileFullPath
        $i+" disabled"
    }
}

关于shell - 需要使用批处理/Windows 命令行枚举未知的注册表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33627601/

相关文章:

ios - SQLite - 外键约束 - IOs 5

keyboard - 如何在 Mac OS X 中重新映射 "Context Menu"键?

shell - 切 |排序 | uniq-d-c |但?

shell - 在 shell 中不逐行比较 2 个文件

c - 为什么我应该使用 fork() 在 C 中制作简单的 shell

Tomcat命令检查配置文件?

linux - ubuntu中的脚本同时获取CPU温度和CPU使用率并保存到文件

laravel - Laravel 默认命令在哪里?

ssl - paypal-wps 加密问题。 Paypal 错误 : We were unable to decrypt the certificate id

linux - 查找并sed : remove lines