Batch file 批处理文件:检查多个注册表项,根据需要创建/更改,然后继续?

Batch file 批处理文件:检查多个注册表项,根据需要创建/更改,然后继续?,batch-file,registry,Batch File,Registry,好的,我需要一个批处理命令(可能是FOR循环?),来检查多个注册表项是否存在stateflags001键 如果密钥不存在,请创建它并将其值设置为0x2。 如果确实存在,请确保其值设置为0x2 我知道我可以用一些聪明的IF命令来完成这项工作,但我想知道它是否可以以某种方式大大简化 最终,我希望通过批处理自动执行cleanmgr/sagerun:1命令,这样我就可以取消cleanmgr/sageset:1命令,因为这个批处理将被发送给一些朋友和家人,他们甚至对在计算机上执行基本任务都不太了解。 让他

好的,我需要一个批处理命令(可能是
FOR
循环?),来检查多个注册表项是否存在
stateflags001

如果密钥不存在,请创建它并将其
值设置为
0x2
。 如果确实存在,请确保其值设置为
0x2

我知道我可以用一些聪明的
IF
命令来完成这项工作,但我想知道它是否可以以某种方式大大简化

最终,我希望通过批处理自动执行
cleanmgr/sagerun:1
命令,这样我就可以取消
cleanmgr/sageset:1
命令,因为这个批处理将被发送给一些朋友和家人,他们甚至对在计算机上执行基本任务都不太了解。 让他们运行一个批处理文件会容易得多,然后我将引导他们完成
cleanmgr sageset:1
命令之后/期间的步骤

在有人问“为什么不简单地将
VolumeCaches
文件夹中的所有内容设置为您需要的内容?”之前,我省略了几个键,因为我不希望它们包含在清理过程中,所以这不是一个选项

当然,如果与我的请求相反,省略它们并在剩下的部分(即下面的键)上运行循环更容易,那么,无论如何,让我们这样做吧

以下是问题的关键:

REG QUERY "HKLM\\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Active Setup Temp Folders" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Downloaded Program Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Internet Cache Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Memory Dump Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Old ChkDsk Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Previous Installations" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Recycle Bin" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Setup Log Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\System error memory dump files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\System error minidump files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Setup Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Thumbnail Cache" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Upgrade Discarded Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting Archive Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting Queue Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting System Archive Files" /v "StateFlags0001" | Find "0x2"
REG QUERY "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting System Queue Files" /v "StateFlags0001" | Find "0x2"
简而言之

检查上述键是否有
stateflags001
。 如果存在,请确保值为
0x2
。 如果不存在,则创建它并将值设置为
0x2
。 运行
cleanmgr/sagerun:1
。 退出


一如既往,感谢您的启发!!!;)

正如您所怀疑的,
for
是您的朋友

从这样的事情开始

@echo off
for /f "skip=4 tokens=*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\"') do (
  echo %%~na
  for /f "tokens=*" %%b in ('REG QUERY "%%a" /v "StateFlags0001" 2^>^&1 ^| Find "0x2"') do (
    echo %%b
  )
)
然后通过对键的适当处理更改
echo
命令

EDIT1:
我已经编辑了一些代码,向您展示了如何处理密钥名称

  • 注意
    skip=4
    选项,以跳过
    REG查询的第一行
    输出

  • echo%%~na
    来提取密钥名称,以便对其进行处理,并有条件地执行第二个
    REG查询

  • EDIT2: 在BAT文件中,根据字符串列表检查字符串有点棘手。这里有一些代码让你开始

    初始化变量以保存感兴趣的键

    set keys=Active Setup Temp Folders
    set keys=!keys!,Downloaded Program Files
    set keys=!keys!,Internet Cache Files
    set keys=!keys!,Memory Dump Files
    set keys=!keys!,Old ChkDsk Files
    set keys=!keys!,Previous Installations
    set keys=!keys!,Recycle Bin
    set keys=!keys!,Setup Log Files
    set keys=!keys!,System error memory dump files
    set keys=!keys!,System error minidump files
    set keys=!keys!,Temporary Files
    set keys=!keys!,Office Setup Files
    set keys=!keys!,Temporary Setup Files
    set keys=!keys!,Thumbnail Cache
    set keys=!keys!,Upgrade Discarded Files
    set keys=!keys!,Windows Error Reporting Archive Files
    set keys=!keys!,Windows Error Reporting Queue Files
    set keys=!keys!,Windows Error Reporting System Archive Files
    set keys=!keys!,Windows Error Reporting System Queue Files
    set keys=!keys!,Recycle Bin
    
    然后,在外部for循环中,将
    echo
    命令更改为

      call :findkey %%~na
    
    并添加找到时要继续执行的代码

      if "!foundkey!" NEQ "" ( 
        for /f "tokens=*" %%b in ('REG QUERY "%%a" /v "StateFlags0001" 2^>^&1 ^| Find "0x2"') do (
          echo %%b
    
    然后添加解析列表的逻辑

    :findkey
    set keylist=!keys!
    set foundkey=
    :againlist
    for /f "tokens=1* delims=," %%k in ("!keylist!") do (
      if "%%k" NEQ "" ( 
        if /i "%*"=="%%k" (
          set foundkey=%%k
          goto :found
        )
      )
      if "%%l" NEQ "" (
          set keylist=%%l
          goto :againlist
      )
    )
    :found
    goto :eof
    
    记住还要加上

    setlocal enabledelayedexpansion

    在BAT文件的开头,因为它是
    for
    循环的
    内部适当变量扩展所必需的

    EDIT3:

    一种更简单的查找方法

    :findkey
    set foundkey=
    for %%k in (!keys!) do (
      set curkey=%%k
      set curkey=!curkey:_= !
      if /i "!curkey!"=="%*" (
        set foundkey=!curkey!
      )
    ) 
    goto :eof
    
    这对于
    更简单的
    ,需要!钥匙!要用空格隔开,所以你需要准备!钥匙!用下划线替换所有空格,用空格替换逗号

    set keys=!keys: =_!
    set keys=!keys:,= !
    
    现在,把所有的部分放在一起

    @echo off
    setlocal enabledelayedexpansion
    set keys=Active Setup Temp Folders
    set keys=!keys!,Downloaded Program Files
    set keys=!keys!,Internet Cache Files
    set keys=!keys!,Memory Dump Files
    set keys=!keys!,Old ChkDsk Files
    set keys=!keys!,Previous Installations
    set keys=!keys!,Recycle Bin
    set keys=!keys!,Setup Log Files
    set keys=!keys!,System error memory dump files
    set keys=!keys!,System error minidump files
    set keys=!keys!,Temporary Files
    set keys=!keys!,Temporary Setup Files
    set keys=!keys!,Thumbnail Cache
    set keys=!keys!,Upgrade Discarded Files
    set keys=!keys!,Windows Error Reporting Archive Files
    set keys=!keys!,Windows Error Reporting Queue Files
    set keys=!keys!,Windows Error Reporting System Archive Files
    set keys=!keys!,Windows Error Reporting System Queue Files
    set keys=!keys: =_!
    set keys=!keys:,= !
    
    for /f "skip=4 tokens=*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\"') do (
      call :findkey %%~na
      if "!foundkey!" NEQ "" ( 
        for /f "tokens=*" %%b in ('REG QUERY "%%a" /v "StateFlags0001" 2^>^&1 ^| Find "0x2"') do (
          echo %%b
        )
      )
    )
    goto :eof
    
    :findkey
    set foundkey=
    for %%k in (!keys!) do (
      set curkey=%%k
      set curkey=!curkey:_= !
      if /i "!curkey!"=="%*" (
        set foundkey=!curkey!
      )
    ) 
    goto :eof
    

    正如您已经怀疑的,
    for
    是您的朋友

    从这样的事情开始

    @echo off
    for /f "skip=4 tokens=*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\"') do (
      echo %%~na
      for /f "tokens=*" %%b in ('REG QUERY "%%a" /v "StateFlags0001" 2^>^&1 ^| Find "0x2"') do (
        echo %%b
      )
    )
    
    然后通过对键的适当处理更改
    echo
    命令

    EDIT1:
    我已经编辑了一些代码,向您展示了如何处理密钥名称

  • 注意
    skip=4
    选项,以跳过
    REG查询的第一行
    输出

  • echo%%~na
    来提取密钥名称,以便对其进行处理,并有条件地执行第二个
    REG查询

  • EDIT2: 在BAT文件中,根据字符串列表检查字符串有点棘手。这里有一些代码让你开始

    初始化变量以保存感兴趣的键

    set keys=Active Setup Temp Folders
    set keys=!keys!,Downloaded Program Files
    set keys=!keys!,Internet Cache Files
    set keys=!keys!,Memory Dump Files
    set keys=!keys!,Old ChkDsk Files
    set keys=!keys!,Previous Installations
    set keys=!keys!,Recycle Bin
    set keys=!keys!,Setup Log Files
    set keys=!keys!,System error memory dump files
    set keys=!keys!,System error minidump files
    set keys=!keys!,Temporary Files
    set keys=!keys!,Office Setup Files
    set keys=!keys!,Temporary Setup Files
    set keys=!keys!,Thumbnail Cache
    set keys=!keys!,Upgrade Discarded Files
    set keys=!keys!,Windows Error Reporting Archive Files
    set keys=!keys!,Windows Error Reporting Queue Files
    set keys=!keys!,Windows Error Reporting System Archive Files
    set keys=!keys!,Windows Error Reporting System Queue Files
    set keys=!keys!,Recycle Bin
    
    然后,在外部for循环中,将
    echo
    命令更改为

      call :findkey %%~na
    
    并添加找到时要继续执行的代码

      if "!foundkey!" NEQ "" ( 
        for /f "tokens=*" %%b in ('REG QUERY "%%a" /v "StateFlags0001" 2^>^&1 ^| Find "0x2"') do (
          echo %%b
    
    然后添加解析列表的逻辑

    :findkey
    set keylist=!keys!
    set foundkey=
    :againlist
    for /f "tokens=1* delims=," %%k in ("!keylist!") do (
      if "%%k" NEQ "" ( 
        if /i "%*"=="%%k" (
          set foundkey=%%k
          goto :found
        )
      )
      if "%%l" NEQ "" (
          set keylist=%%l
          goto :againlist
      )
    )
    :found
    goto :eof
    
    记住还要加上

    setlocal enabledelayedexpansion

    在BAT文件的开头,因为它是
    for
    循环的
    内部适当变量扩展所必需的

    EDIT3:

    一种更简单的查找方法

    :findkey
    set foundkey=
    for %%k in (!keys!) do (
      set curkey=%%k
      set curkey=!curkey:_= !
      if /i "!curkey!"=="%*" (
        set foundkey=!curkey!
      )
    ) 
    goto :eof
    
    这对于
    更简单的
    ,需要!钥匙!要用空格隔开,所以你需要准备!钥匙!用下划线替换所有空格,用空格替换逗号

    set keys=!keys: =_!
    set keys=!keys:,= !
    
    现在,把所有的部分放在一起

    @echo off
    setlocal enabledelayedexpansion
    set keys=Active Setup Temp Folders
    set keys=!keys!,Downloaded Program Files
    set keys=!keys!,Internet Cache Files
    set keys=!keys!,Memory Dump Files
    set keys=!keys!,Old ChkDsk Files
    set keys=!keys!,Previous Installations
    set keys=!keys!,Recycle Bin
    set keys=!keys!,Setup Log Files
    set keys=!keys!,System error memory dump files
    set keys=!keys!,System error minidump files
    set keys=!keys!,Temporary Files
    set keys=!keys!,Temporary Setup Files
    set keys=!keys!,Thumbnail Cache
    set keys=!keys!,Upgrade Discarded Files
    set keys=!keys!,Windows Error Reporting Archive Files
    set keys=!keys!,Windows Error Reporting Queue Files
    set keys=!keys!,Windows Error Reporting System Archive Files
    set keys=!keys!,Windows Error Reporting System Queue Files
    set keys=!keys: =_!
    set keys=!keys:,= !
    
    for /f "skip=4 tokens=*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\"') do (
      call :findkey %%~na
      if "!foundkey!" NEQ "" ( 
        for /f "tokens=*" %%b in ('REG QUERY "%%a" /v "StateFlags0001" 2^>^&1 ^| Find "0x2"') do (
          echo %%b
        )
      )
    )
    goto :eof
    
    :findkey
    set foundkey=
    for %%k in (!keys!) do (
      set curkey=%%k
      set curkey=!curkey:_= !
      if /i "!curkey!"=="%*" (
        set foundkey=!curkey!
      )
    ) 
    goto :eof
    

    如果我错了,请纠正我,但是您的代码不只是将键/值添加到VolumeCaches文件夹中包含的所有内容吗?我不想那样。我只是想修改上面看到的键。上面的代码并没有“简单地添加”任何键。您需要添加自己的密钥处理逻辑。我已经编辑了一些代码,向您展示了如何在代码中处理密钥名称。注意
    skip=4
    选项,以跳过
    REG查询的第一行
    输出;和echo
    %%~na
    来提取密钥名称,以便对其进行处理,并有条件地执行第二个
    REG查询
    。很抱歉回复太晚。谢谢你的解释,你的代码可以解决这个问题。如果我错了,请纠正我,但是你的代码不会简单地将键/值添加到VolumeCaches文件夹中的所有内容吗?我不想那样。我只是想修改上面看到的键。上面的代码并没有“简单地添加”任何键。您需要添加自己的密钥处理逻辑。我已经编辑了一些代码,向您展示了如何在代码中处理密钥名称。注意
    skip=4
    选项,以跳过
    REG查询的第一行
    输出;和echo
    %%~na
    来提取密钥名称,以便对其进行处理,并有条件地执行第二个
    REG查询
    。很抱歉回复太晚。谢谢你的解释,