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 /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)
| 归档时间: |
|
| 查看次数: |
14278 次 |
| 最近记录: |