How can I get the value of a registry key from within a batch script?

前端 未结 17 2472
抹茶落季
抹茶落季 2020-11-27 15:12

I need to use a REG QUERY command to view the value of a key and set the result into a variable with this command:

FOR /F \"tokens=2* delims=    \" %%A IN (\         


        
相关标签:
17条回答
  • 2020-11-27 15:23

    Based on tryingToBeClever solution (which I happened to also stumble upon and fixed myself by trial-and-error before finding it), I also suggest passing the result output of reg query through find in order to filter undesired lines due to the ! REG.EXE VERSION x.y inconsistency. The find filtering and tokens tweaking also allows to pick exactly what we want (typically the value). Also added quotes to avoid unexpected results with key/value names containing spaces.

    Final result proposed when we are only interested in fetching the value:

    @echo off
    setlocal ENABLEEXTENSIONS
    set KEY_NAME=HKCU\Software\Microsoft\Command Processor
    set VALUE_NAME=DefaultColor
    for /F "usebackq tokens=3" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
      echo %%A
    )
    

    A potential caveat of using find is that the errorlevel set by reg when errors occur is now obfuscated so one should only use this approach for keys known to be there and/or after a previous validation.

    A tiny additional optimization (add skip=1 to avoid processing the first line of output) can be done in cases when the key name also contains the value name (as it is the case with HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion and CurrentVersion) but removes most flexibility so should only be used in particular use-cases.

    0 讨论(0)
  • 2020-11-27 15:24

    To get a particular answer to the registry value you may use the following query:

    REG QUERY "Key_Name" /v "Value_Name" /s

    eg: REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v "EnableExtensions" /s

    here /v : Queries for a specific registry key values.

    /s : Queries all subkeys and values recursively (like dir /s)

    0 讨论(0)
  • 2020-11-27 15:25

    This works for me:

    @echo OFF
    
    setlocal ENABLEEXTENSIONS
    set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
    set VALUE_NAME=DefaultColor
    
    FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
        set ValueName=%%A
        set ValueType=%%B
        set ValueValue=%%C
    )
    
    if defined ValueName (
        @echo Value Name = %ValueName%
        @echo Value Type = %ValueType%
        @echo Value Value = %ValueValue%
    ) else (
        @echo %KEY_NAME%\%VALUE_NAME% not found.
    )
    

    usebackq is needed since the command to REG QUERY uses double quotes.

    skip=4 ignores all the output except for the line that has the value name, type and value, if it exists.

    2^>nul prevents the error text from appearing. ^ is the escape character that lets you put the > in the for command.

    When I run the script above as given, I get this output:

    Value Name = DefaultColor
    Value Type = REG_DWORD
    Value Value = 0x0
    

    If I change the value of VALUE_NAME to BogusValue then I get this:

    "HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
    
    0 讨论(0)
  • 2020-11-27 15:25

    I realize this is an old question - but this one-liner is pretty much the same as your original try with a couple of additions. It works with paths including spaces, and works in both XP and Windows 7 even if the key is not found (and hides the error). %fn% will be empty if the key does not exist. This example gets the current desktop background filename:

    for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 2^>^&1^|find "REG_"') do @set fn=%%b
    
    0 讨论(0)
  • 2020-11-27 15:27

    For Windows 7 (Professional, 64-bit - can't speak for the others) I see that REG no longer spits out

    ! REG.EXE VERSION 3.0
    

    as it does in XP. So the above needs to be modified to use

    skip=2
    

    instead of 4 - which makes things messy if you want your script to be portable. Although it's much more heavyweight and complex, a WMIC based solution may be better.

    0 讨论(0)
  • 2020-11-27 15:28
    @echo off
    setlocal ENABLEEXTENSIONS
    set KEY_NAME=HKLM\SOFTWARE\Wow6432Node\Acme Software Inc\Common
    set VALUE_NAME=InstallDir
    
    FOR /F "tokens=2*" %%A IN ('REG.exe query "%KEY_NAME%" /v "%VALUE_NAME%"') DO (set pInstallDir=%%B)
    echo %pInstallDir%
    

    That works for me in Win7 where the key has a space and the value also has a space. So saving the above in c:\temp as test.bat, open a cmd window and run it.

    C:\temp>test

    C:\Program Files (x86)\acme Software Inc\APP\

    0 讨论(0)
提交回复
热议问题