2012-08-08 102 views
3

我使用以下代码来获取启动时运行的程序列表,并将它们记录到文件中。查询批处理脚本中的注册表项

for /f "skip=2 tokens=1,2*" %%A in ('REG QUERY "HKCU\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run" 2^>NUL') do echo %%A : %%C >> Log.txt

这适用于当值名称不包含空格的条目,但是当它,比如用“谷歌更新”,它搅乱了记号,并%% C成为:REG_SZ <path> ,而不仅仅是路径。

有没有人有更好的方式来查询注册表并记录它的值?

+0

如果你用“有usebackq”在选项? http://ss64.com/nt/for_f.htm – npocmaka 2012-08-09 06:23:51

+0

然后它根本不起作用。你的链接也死了。 – Josh 2012-08-09 12:05:44

+0

如果你使用usebackq,你需要用括号括住“'”(转义按钮) - 链接http://ss64.com/nt/for_f.html – npocmaka 2012-08-09 14:23:36

回答

1

嗯,我有一个工作解决方案,我仍然喜欢看有没有人有更好的。

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 
    ) 
) 
0

特定于版本,在XP中工作,在Win 7中不起作用 - 请参阅注释以了解详细信息。

列在输出由制表字符(0×09)分开的,所以只能使用标签作为分隔符:
for /f "skip=2 tokens=1,2* delims= " %%A
这并不表明的好,因为标记如何处理白色字符,但经过delims=必须在字元是真实的TAB

+0

Doesn没有工作,在我的系统上,输出被4个空格字符分隔(Windows 7) – Josh 2012-08-09 14:45:22

+0

无赖!我注意到你必须使用不同版本的工具,但很快就驳回了他们在新版本中实际上会使得实用程序不太适用的想法 - 显然我错了。顺便说一句我刚刚发现:[在Windows 7脚本与XP脚本reg.exe的行为差异](http://social.technet.microsoft.com/Forums/zh/ITCG/thread/62b13853-d39e-4780-8859- c696411da942) - 它讨论了一些方法 - 其中之一就是用一个不同的字符替换4个空格 - 也许你会发现其中一些有用。 – wmz 2012-08-09 16:15:23

0

这里是通过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`