如何获取注册表值并批量设置为变量

Joh*_*ohn 12 windows-registry batch

我需要在注册表项中获取一个值并使用批处理文件存储在一个变量中。

我写了一个基本的命令行来举例说明我的逻辑(使用 echo 而不是设置变量):

for /f "tokens=3 delims=    " %%a in ('reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "LastUsedUsername" ^|findstr /ri "REG_SZ"') do echo=%%a
Run Code Online (Sandbox Code Playgroud)

我希望用户名打印在屏幕上,但它没有发生。

我确定注册表值“LastUsedUsername”不为空,它确实有数据。此外,分隔符是制表符,而不是空格。

编辑

如果我只是输入

reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "LastUsedUsername"
Run Code Online (Sandbox Code Playgroud)

...它返回:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
    LastUsedUsername    REG_SZ    Administrador
Run Code Online (Sandbox Code Playgroud)

这段代码

reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "LastUsedUsername" ^| findstr /ri "REG_SZ"
Run Code Online (Sandbox Code Playgroud)

...返回:

    LastUsedUsername    REG_SZ    Administrador
Run Code Online (Sandbox Code Playgroud)

然后,当我使用 for 命令时,我没有从 echo 中得到任何输出。

小智 8

在某些情况下,批准的答案不正确 - 如果从注册表中读取的值包含白色字符,即空格(程序文件(x86)),则它仅返回值的第一部分(“程序”)。我想出的是:

FOR /F "tokens=2* skip=2" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion" /v "CommonFilesDir"') do echo %%b
Run Code Online (Sandbox Code Playgroud)

结果是 C:\Program Files\Common Files

  • @IgorLevicki 答案没有被打破,但你确实成功地打破了它。如果您在末尾留下“%%b”,您将得到正确的响应。当执行“for /f”循环并设置“tokens”选项以检索多个值时(例如“tokens=2,*”意味着获取第二部分,然后是后面的所有内容 - 逗号可能会被省略,如答案所示) ),“cmd.exe”使用单字符名称填充指定的变量,并使用所需数量的额外变量(其中连续字符作为请求的额外值的名称)(此处为单个“%%b”)。 (3认同)

小智 6

您根本不需要 delims 开关,因为默认值是空格,这是 reg 查询返回的内容。在为这个 for 循环和注册表创建一个 bat 文件时,我得到了正确的回声,例如,RGB 背景颜色的“红色”值为 55:

for /f "tokens=3" %%a in ('reg query "HKCU\Control Panel\Colors"  /V Background  ^|findstr /ri "REG_SZ"') do echo %%a
Run Code Online (Sandbox Code Playgroud)