我有一个读取注册表值的批处理文件。
然而,我正在阅读的条目包含空格,我似乎只在设置变量时捕获第一个空格字符之前的所有内容。
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
有人知道如何解决这个问题吗?
由于
答案 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%