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

Cra*_*ger 13 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\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDKTools
    InstallationFolder    REG_SZ    C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\
Run Code Online (Sandbox Code Playgroud)

键名,键类型和键值由一系列空格分隔,而不是制表符.

你认为你可以使用类似的东西:

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
Run Code Online (Sandbox Code Playgroud)

...但是如果键包含空格,在这种情况下,命令行上发出的结果是:

C:\Users\Administrator\Desktop>SET sdkpath=C:\Program
Run Code Online (Sandbox Code Playgroud)

哪个没用.似乎没有通配符变量来说"所有匹配".你不能只写:

DO SET sdkpath=%%L %%M
Run Code Online (Sandbox Code Playgroud)

...因为如果路径中没有空格,那将产生一个文字%M(并且还会产生一个尾随空格).

所以.有没有办法在批处理文件中做这个简单的事情?

我已经在Powershell(以及一些Perl)中编写了大部分工具,但是我需要使用批处理文件来完成callvisual studio/windows sdk环境脚本的"简单"任务,然后在使用健全的语言中调用代码.环境已经建立.

你会认为,经过10多年cmd.exe的存在,command.com在此之前,这将很容易.救命?

(我可以使用Perl和Win32::包来查询注册表,但它无法帮助我将它变成批处理var ......)

使用Win2k12.

我读了:

还有许多其他人,但没有人处理从密钥中正确读取值而不知道它是否包含空格/数量的一般情况.

Dav*_*ann 14

啊这是关于for /f命令的烦人细节之一.为了读取所有的字符,包括与空格*前面令牌需要声明.tokens=2,* 功能原因在文档中说明.

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

FOR文档

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
Run Code Online (Sandbox Code Playgroud)

  • 哇.现在我比以往更讨厌批处理文件了.但是,谢谢你. (5认同)