Windows 将注册表值读取到批处理变量,处理值中的空格

Windows 将注册表值读取到批处理变量,处理值中的空格,windows,batch-file,Windows,Batch File,我正在努力将注册表项的值读入变量。注册表值可以包含空格,也可以不包含空格。在本例中,我尝试查找SDK路径 使用reg query很容易获得值,但返回的格式却毫无帮助: C:\Users\Administrator\Desktop>reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder HKEY_LOCAL_MACHINE\SOFTWARE\Micro

我正在努力将注册表项的值读入变量。注册表值可以包含空格,也可以不包含空格。在本例中,我尝试查找SDK路径

使用
reg query
很容易获得值,但返回的格式却毫无帮助:

C:\Users\Administrator\Desktop>reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools
    InstallationFolder    REG_SZ    C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\
键名、键类型和键值由一系列空格(而不是制表符)分隔

您可能会认为您可以使用以下内容:

FOR /F "usebackq tokens=3* skip=2" %%L IN (
    `reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder`
) DO SET sdkpath=%%L
。。。但如果该键包含空格(如本例所示),则命令行上发出的结果为:

C:\Users\Administrator\Desktop>SET sdkpath=C:\Program
这是没有帮助的。似乎没有一个通配符变量来表示“所有匹配”。你不能只写:

DO SET sdkpath=%%L %%M
。。。因为如果路径中没有空格,则会产生一个文本
%M
(也会产生一个尾随空格)

所以。有没有办法在批处理文件中完成这个简单的操作

我已经用Powershell(和一些Perl)编写了我的大部分工具,但我需要使用批处理文件来执行
调用
的“简单”任务,即调用visual studio/windows sdk环境脚本,然后在环境设置后用正常语言调用代码

你可能会认为,在
cmd.exe
存在10多年之后,以及在
command.com
之前,这将很容易。帮忙

(我可以使用Perl和
Win32::
包来查询注册表,但它不能帮助我将其放入批处理变量…)

使用Win2k12

我读过:


还有许多其他的,但是没有一个能够处理从键正确读取值的一般情况,而不知道它是否包含空格/有多少空格

Ah这是关于
for/f
命令的恼人细节之一。为了读取所有字符,包括带有
*
的空格,需要声明上一个标记<代码>标记=2,*
功能原因在文档中说明

如果tokens=字符串中的最后一个字符是星号(*),则会分配一个附加变量,并在解析的最后一个标记后的行上接收剩余文本

使用引号

SET“sdkpath=%%M”

相反,
SET sdkpath=%%M


这将避免空间问题。

Wow。现在我比以前更讨厌批处理文件。但非常感谢。如果你和我一样,有阅读理解问题,请注意%%L自动变成%%M。这不是问题的答案,应该是对David Ruhmann回答的评论。是的,你是对的,但我不能评论他的帖子。(
FOR /F "usebackq tokens=2,* skip=2" %%L IN (
    `reg query "HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools" /v InstallationFolder`
) DO SET sdkpath=%%M