7

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

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

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

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

谢谢

4

3 回答 3

9

发生此问题是因为字符串包含空格,并且字符串的第二部分(如果有更多空格,可能更多部分)被视为另一个标记(在 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
)

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

于 2013-04-29T15:18:34.253 回答
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*用作标记 - 第一个、第二个和剩余行。

下一个小困难是数据项 ALSO 包含)它被解释为的右括号,FOR/f因此给出错误 - 在你的情况下,\Dir1\Dir2这里不是预期的

克服这个问题的一种方法是引用,然后删除分配给的值home

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

打开分配给 HOME 的值的存在/不存在克服了这个问题。Valuename显然,尽管这里有一个隐藏的失败失败,但也可以这样说。

如果未找到所请求的注册表项,则不执行SET中的 s FOR/f,因此三个变量的值不会从它们在FOR/f执行之前可能具有的任何值更改。因此,如果home(或者valuename如果您选择使用该值)具有someexistingvalue之前的值,for/f则可能会出现意外结果。

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

于 2013-04-29T15:21:20.520 回答
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%
于 2020-08-21T09:07:00.130 回答