Windows 将注册表值读取到批处理变量,处理值中的空格
我正在努力将注册表项的值读入变量。注册表值可以包含空格,也可以不包含空格。在本例中,我尝试查找SDK路径 使用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
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