我正在使用以下代码获取启动时运行的程序列表,并将它们记录到文件中。
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
这适用于值名称不包含空格的条目,但是当它的名称不包含空格时,例如“Google Update”,它会混乱令牌,而%% C变为:REG_SZ <path>
,而不是只是路径。
有没有人有更好的方法来查询注册表并记录其值?
答案 0 :(得分: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
)
)
答案 1 :(得分:0)
特定于版本,在XP中运行,在Win 7中不起作用 - 有关详细信息,请参阅注释。
输出中的列由制表符char(0x09)分隔,因此仅使用制表符作为分隔符:
for /f "skip=2 tokens=1,2* delims= " %%A
由于标记处理白色字符的方式不正确,但delims=
之后的字符必须是实际的TAB
答案 2 :(得分: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`