使用批处理文件读取包含空格的注册表值

时间:2013-04-29 14:27:17

标签: batch-file registry

我有一个读取注册表值的批处理文件。

然而,我正在阅读的条目包含空格,我似乎只在设置变量时捕获第一个空格字符之前的所有内容。

set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry"
set VALUE_NAME=Home

FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A
    set ValueType=%%B
    set Home=%%C
)

if defined ValueName (
    @echo Home = %Home%
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

主注册表项实际上包含此字符串:“C:\ Program Files(x86)\ Dir1 \ Dir2”,批处理文件仅捕获此:C:\ Program

有人知道如何解决这个问题吗?

由于

3 个答案:

答案 0 :(得分:7)

发生此问题是因为字符串包含空格而字符串的第二部分(如果有更多空格可能更多部分)被视为另一个标记(在4,5等中)要解决此问题,请通过其余部分带有星号的%% C到这样的行:

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A
    set ValueType=%%B
    set Home=%%C
)

星号(*)表示将该行的其余部分传递给下一个变量(包含所有空格)。

答案 1 :(得分:4)

@ECHO OFF
SETLOCAL
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\My Entry"
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Space Sciences Laboratory, U.C. Berkeley\BOINC Setup"
set VALUE_NAME=migrationdir

FOR /F "usebackq skip=2 tokens=1,2*" %%A IN (
 `REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set "ValueName=%%A"
    set "ValueType=%%B"
    set Home="%%C"
)

IF DEFINED home SET home=%home:"=%
if defined Home echo Home = %Home%
if NOT defined Home echo %KEY_NAME%\%VALUE_NAME% not found.

由于我没有...\My Entry作为密钥,我已经替换了我所拥有的密钥。

第一项 - 由于所需数据包含空格,而空格是默认分隔符,因此您需要使用1,2*作为标记 - 第一行,第二行和余数行。

接下来的一个小难点是,数据项还包含) whic被解释为FOR/f的右括号因此给出了错误 - 在您的情况下,\Dir1\Dir2在此不期望

解决此问题的方法是引用,然后删除分配给home

的值

但是再一次,home中的右括号用于终止IF语句的TRUE部分。

切换分配给HOME的值的存在/不存在克服了这一点。显然,Valuename也可以这样说,尽管这里隐藏着失败的失败。

如果找不到请求的注册表项,则SET中的FOR/f不会被执行,因此三个变量的值不会从FOR/f之前的任何值更改{ {1}}已执行。因此,如果home(如果您选择使用该值,则为valuename)在someexistingvalue之前的值为for/f,则可能会显示意外结果。

(顺便说一句 - 在for/f子句的任何一个或两个括号中打破IN是合法且更整洁的

答案 2 :(得分:0)

我使用delims=:来轻松解决目录中未知数量的空格。 此解决方案应仅用于带有盘符的目录或文件路径的值,因此这不是通用解决方案...

ECHO OFF
SETLOCAL ENABLEEXTENSIONS

FOR /F "tokens=1,2* skip=2 delims=:" %%a in ('REG QUERY "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Administrative Tools" 2^>nul') DO (SET "regA=%%a" & SET "regB=%%b")
SET usrDeskPath=%regA:~-1%:%regB%

ECHO.
ECHO %usrDeskPath%
相关问题