Batch file 在批处理脚本中查询注册表项

Batch file 在批处理脚本中查询注册表项,batch-file,cmd,windows-scripting,Batch File,Cmd,Windows Scripting,我使用下面的代码获取启动时运行的程序列表,并将它们记录到一个文件中 对于('REG QUERY“HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run”2^>NUL)中的/f“skip=2令牌=1,2*”%%A,请执行echo%%A:%%C>>Log.txt 这适用于值名称不包含空格的条目,但如果包含空格,例如“Google Update”,则会弄乱令牌,%%C变成:REG_SZ,而不仅仅是路径 是否有人有更好的方法查询注册表

我使用下面的代码获取启动时运行的程序列表,并将它们记录到一个文件中

对于('REG QUERY“HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run”2^>NUL)中的/f“skip=2令牌=1,2*”%%A,请执行echo%%A:%%C>>Log.txt

这适用于值名称不包含空格的条目,但如果包含空格,例如“Google Update”,则会弄乱令牌,%%C变成:
REG_SZ
,而不仅仅是路径

是否有人有更好的方法查询注册表并记录其值?

特定版本,在XP中工作,在Win 7中不工作-有关详细信息,请参阅注释

输出中的列由tab char(0x09)分隔,因此仅使用tab作为分隔符:
for/f“skip=2令牌=1,2*delims=“%%A


由于标记处理白色字符的方式,这一点显示得不好,但是
delims=
后面的字符必须是实际的
TAB

我有一个可行的解决方案,我仍然很想看看是否有人有更好的解决方案

for /f "skip=2 tokens=*" %%A in ('REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" 2^>NUL') do (
    set regstr=%%A
    set regstr=!regstr:    =^|!

    for /f "tokens=1,3 delims=  |" %%X in ("!regstr!") do (
        echo %%X : %%Y
    )
)

以下是一种更好的方法,通过WMI调用Win32_StartupCommand类,将结果输出到屏幕,并根据脚本名称在同一文件夹中创建CSV文件:

@echo off
setlocal enabledelayedexpansion
    cd \ & pushd "%~dp0"
if exist "%~n0.tmp" (del /f /q "%~n0.tmp")
if exist "%~n0.csv" (del /f /q "%~n0.csv")
wmic /namespace:\\root\cimv2 path Win32_StartupCommand get /all /format:csv >"%~n0.tmp"
for /f "tokens=1,2,3,4,5,6,7,8,9 usebackq delims=, skip=2" %%a in (`type "%~n0.tmp"`) do (
  echo %%b, %%c >>"%~n0.csv"
  echo %%b, %%c
)
if exist "%~n0.tmp" (del /f /q "%~n0.tmp")
popd & endlocal
exit /b 0`

如果在选项中使用“usebackq”会怎么样?那就根本不起作用了。此外,您的链接已失效。如果使用usebackq,则需要将表达式用“`”(escape下的按钮)括在括号中-链接@npocmaka仍然不起作用..不起作用,在我的系统上,输出由4个空格字符分隔(Windows 7)bummer!我注意到您必须使用不同版本的工具,但很快就否定了这样的想法,即它们实际上会使实用程序在较新的版本中变得不那么有用——显然我错了。顺便说一句,我刚刚发现了这一点:-它讨论了一些方法-其中之一是简单地用不同的字符替换4个空格-也许你会发现其中一些有用。