我在注册表中有一些条目。例如:
ValueName ValueData
a b c.exe True
abc.exe False
etc.
我的试用:
@echo off
set key=path to reg. key
for /f "tokens=1,3" %%a in ('reg query "%key%" /v "*.exe"') do (
echo Value Name: %%a
echo Value Data: %%b
)
pause
使用上面的代码,由于空格,我没有得到所需的输出:
Value Name: a
Value Data: REG_SZ
Value Name: abc.exe
Value Data: False
输出应该是带有空格的完整值名称或任何符号和值数据,如下例所示:
Value Name: a b c.exe
Value Data: True
Value Name: abc.exe
Value Data: False
如上面的示例,我们在注册表中也有包含空格的值名称。因此,使用我的踪迹,我无法使用批处理文件脚本获得所需的输出。
有人有什么想法吗?
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the directories and filenames are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These are required only for the demonstration
SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q76951819.txt"
ECHO method 1
FOR /f "usebackqskip=1delims=" %%e IN ("%filename1%") DO (
SET "line=%%e"
SET "name=!line:~0,21!"
CALL :trim name
ECHO Value name : !name!
ECHO Value data : !line:~21!
)
ECHO method 2
FOR /f "usebackqskip=1delims=" %%e IN ("%filename1%") DO (
SET "line=%%e"
SET "data=!line:* =!"
CALL SET "line=%%line: !data!=%%"
CALL :trim line
CALL :trim data
ECHO Value name : !line!
ECHO Value data : !data!
)
GOTO :EOF
:: remove leading and trailing spaces from variable %1
:trim
IF "!%1!"=="" GOTO :eof
IF "!%1:~-1!"==" " SET "%1=!%1:~0,-1!"&GOTO trim
IF "!%1:~0,1!"==" " SET "%1=!%1:~1!"&GOTO trim
GOTO :eof
备注:
我使用了包含您发布的示例数据的文件来进行演示。线路
FOR /f "usebackqskip=1delims=" %%e IN ("%filename1%") DO (
应替换为
FOR /f "skip=1delims=" %%e IN ('reg query "%key%" /v "*.exe"') DO (
直接处理
reg query
命令。
第一种方法中,键值为
21
。由于您发布的数据的第二列从第 20 列和第 22 列开始,因此 21
可能需要调整。只需将所需的行分配给变量 line
并将 line
拆分为前 21 个字符和其余字符。修剪结果并显示。
在第二个中,将前2个连续空格之后的部分分配给
data
,将前2个连续空格之前的部分分配给line
,修剪并显示。
trim
子例程只是检测第一个或最后一个字符是否是空格,将其删除,冲洗并重复。
注意主程序和子程序都依赖
delayedexpansion
。