在Windows批处理文件中嵌套命令并递归地解析结果

时间:2017-04-06 12:53:21

标签: windows batch-file

Screenshot

我正在尝试获取所有注册表项 HKEY_Local_Machine\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList,如果REG_EXPAND_SZ键包含值C:\Users\sas-

,则删除

脚本应该做的理想步骤:

1)获取用户的所有注册表条目使用:

reg query "HKEY_Local_Machine\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" 
    >> xyz.txt

2)如果用户名是sas - ###(我们可以进入" REG_EXPAND_SZ")然后删除此条目:

for /f "skip=10 tokens=* " %%a in (xyz.txt) do (
       for /f "eol=; skip=2 tokens=4 delims=\t" %k in ('reg query "%%a" /t REG_EXPAND_SZ') do (
    if %k == "sas-" (reg delete "%%a")
)
)

2 个答案:

答案 0 :(得分:0)

试试这个:

for /f "tokens=*" %%a in ('
    reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"') do (
        for /f "tokens=*" %%b in ('
            reg query "%%a" /v "ProfileImagePath" 2^>nul ^| find "sas-"') do 
                rem reg delete "%%a"
                echo "%%a" >>C:\names.txt
)

我的基础是您查询ProfileImagePath值,并删除值中包含sas-*的任何键。我还需要删除一些换行符(只是为了便于查看)。

请先测试一下(我现在echo'将它们转换为文本文件),如果您对此感到满意,请从{{rem移除reg delete 1}}行。

答案 1 :(得分:0)

您应该可以从单个For循环执行此操作; 但是,我并不特别喜欢使用此方法删除配置文件的想法。

@Echo Off
For /F "Tokens=1-2*" %%A In ('Reg Query^
 "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /S^
 /F ProfileImagePath /V 2^>Nul') Do (
    If Not "%%~A%%B"=="ProfileImagePathREG_EXPAND_SZ" (
        Set "_C=Reg Delete "%%A%%B"") Else (Set "_P=%%~C"
        SetLocal EnableDelayedExpansion
        If Not "!_P:C:\Users\sas-=!"=="!_P!" Echo=!_C!
        EndLocal))
Timeout -1

如果您对控制台输出感到满意,请从第8行删除Echo=并删除第10行。