2015-11-10 21 views
2

我有個任務枚舉所有註冊表項中需要使用批處理/ Win的命令行

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 

不分配一個值「測試「變量。 與此同時,如果我把

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

它輸出%%b到屏幕上。

我完全失去理解爲什麼它沒有將值傳遞給變量。

我嘗試了一個更簡單的代碼,不用導出到txt文件,然後從中讀取,但它既不起作用。呼應%%a到屏幕上,但不分配一個值設置爲「關鍵」變量:

@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% 
) 

能否請指教?

回答

0

好吧,我自己動手,可能會有人會覺得它有用。它枚舉子鍵並檢查每個中的值。每次之後,它將該值與Dell的已知值進行比較並輸出信息。

在CMD

@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" 
    } 
}