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查询
。很抱歉回复太晚。谢谢你的解释,