For loop 批处理文件以删除注册表项中的多个值

For loop 批处理文件以删除注册表项中的多个值,for-loop,batch-file,registry,For Loop,Batch File,Registry,下面的键有多个值,如“Find”、“Find 0”、“Find 1”、“Find 2”等。 HKCU\Software\Microsoft\VisualStudio\9.0\Find 这些值随着使用而增加,我事先不知道最大值。 目标是创建一个批处理文件来删除所有“Find*”值,而事先不知道最大值 我使用max number=10尝试了以下操作: @ECHO OFF FOR /L %%G IN (0,1,10) DO REG DELETE HKCU\Software\Microsoft\Visu

下面的键有多个值,如“Find”、“Find 0”、“Find 1”、“Find 2”等。 HKCU\Software\Microsoft\VisualStudio\9.0\Find

这些值随着使用而增加,我事先不知道最大值。 目标是创建一个批处理文件来删除所有“Find*”值,而事先不知道最大值

我使用max number=10尝试了以下操作:

@ECHO OFF
FOR /L %%G IN (0,1,10) DO REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v "Find %%G" /f
PAUSE
如果我不知道如何循环到最大值

我可以把一个像100这样的大数字放进去循环,但那是不必要的循环

想法:

在达到最大值后,它会在控制台中抛出一个错误

"Error:  The system was unable to find the specified registry key or value"
我想在一个变量中捕获它,并检查字符串“Error…”,如果为true,则终止循环。
我不知道怎么做。

您需要将FOR循环替换为WHILE循环

当然,批处理脚本中没有“WHILE循环”这类东西。它通常是用IF和GOTO来模拟的

下面是一个示例脚本:

@ECHO OFF
SET G=-1
SET Err=0
:loop
SET /A G+=1
REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v "Find %G%" /f || SET Err=1
IF %Err% == 0 GOTO loop
PAUSE
如您所见,该错误是通过
|
操作符捕获的。只有在
|
之前的命令导致错误时,
|
之后的命令才会执行。因此,当脚本成功删除值时,
Err
变量保持不变,即等于0,因此后续的if-always变量将进行计算s设置为TRUE,并相应地执行GOTO

尝试删除另一个值时,一旦出现错误,就会执行
SET Err=1
命令,因此,我们将退出循环


编辑更改请求的

要解释
Find
参数(名称后不带数字和空格),您必须采取一些不同的操作,可能如下所示:

@ECHO OFF
SET G=-1
SET Err=0
:loop
IF %G% == -1 (SET ParamName="Find") ELSE (SET ParamName="Find %G%")
REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v %ParamName% /f || SET Err=1
IF %Err% == 0 (SET /A G+=1 & GOTO loop)
PAUSE

您需要将FOR循环替换为WHILE循环

当然,批处理脚本中没有“WHILE循环”这类东西。它通常是用IF和GOTO来模拟的

下面是一个示例脚本:

@ECHO OFF
SET G=-1
SET Err=0
:loop
SET /A G+=1
REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v "Find %G%" /f || SET Err=1
IF %Err% == 0 GOTO loop
PAUSE
如您所见,该错误是通过
|
操作符捕获的。只有在
|
之前的命令导致错误时,
|
之后的命令才会执行。因此,当脚本成功删除值时,
Err
变量保持不变,即等于0,因此后续的if-always变量将进行计算s设置为TRUE,并相应地执行GOTO

尝试删除另一个值时,一旦出现错误,就会执行
SET Err=1
命令,因此,我们将退出循环


编辑更改请求的

要解释
Find
参数(名称后不带数字和空格),您必须采取一些不同的操作,可能如下所示:

@ECHO OFF
SET G=-1
SET Err=0
:loop
IF %G% == -1 (SET ParamName="Find") ELSE (SET ParamName="Find %G%")
REG DELETE HKCU\Software\Microsoft\VisualStudio\9.0\Find /v %ParamName% /f || SET Err=1
IF %Err% == 0 (SET /A G+=1 & GOTO loop)
PAUSE

太好了。非常感谢Andrey。我有几个问题1.“| | |之后的命令只有在| |之前的命令导致错误时才会执行。”这句话对任何控制台命令中的所有错误都是正确的吗?我很困惑,因为“REG DELETE”命令没有返回值。2.还有一个值“Find”“它没有任何尾随数字。我如何使用相同的goto循环删除它?@ontherocks:1。它与任何应用程序返回的所谓退出代码有关。它不显示,但可以检查1)使用
IF ERRORLEVEL
指令,2)通过读取
ERRORLEVEL
环境变量,或3)在
&
|
运算符的帮助下。你可以阅读更多关于它的内容。2.我添加了一个修改后的解决方案,但通常你应该发布一个新问题。(虽然您的请求与您最初的问题密切相关,但它在某种程度上改变了我最初的方法。)请记住这一点,以备将来使用。是否可以在BAT、Powershell和Msbuild脚本中执行此操作?@alhambraeidos kiquenet:以上是批处理(BAT)脚本。至于提到的其他工具,我认为它们允许您实现任何可以在批处理脚本中实现的东西,但在这方面我帮不了您多少忙。不过,您可以发布一个关于它的问题(最好为每个工具分别发布一个问题)。这太完美了。非常感谢安德烈。我有几个问题。“只有当| |之前的命令导致错误时,| |之后的命令才会执行。”对于任何控制台命令中的所有错误,此语句是否正确?我很困惑,因为“REG DELETE”命令没有返回值。2.还有一个值“Find”,它没有任何尾随数字。我如何使用相同的goto循环删除它?@ontherocks:1。它与任何应用程序返回的所谓退出代码有关。它不显示,但可以检查1)使用
IF ERRORLEVEL
指令,2)通过读取
ERRORLEVEL
环境变量,或3)在
&
|
运算符的帮助下。你可以阅读更多关于它的内容。2.我添加了一个修改后的解决方案,但通常你应该发布一个新问题。(虽然您的请求与您最初的问题密切相关,但它在某种程度上改变了我最初的方法。)请记住这一点,以备将来使用。是否可以在BAT、Powershell和Msbuild脚本中执行此操作?@alhambraeidos kiquenet:以上是批处理(BAT)脚本。至于提到的其他工具,我认为它们允许您实现任何可以在批处理脚本中实现的东西,但在这方面我帮不了您多少忙。不过,您可以发布一个关于它的问题(最好为每个工具发布一个单独的问题)。