Пакетный файл для удаления нескольких значений в ключе реестра - PullRequest
1 голос
/ 14 апреля 2011

Следующий ключ имел несколько значений, таких как «Найти», «Найти 0», «Найти 1», «Найти 2» и т. Д. HKCU \ Software \ Microsoft \ VisualStudio \ 9.0 \ Find

Значенияувеличение с использованием, и у меня нет предварительных знаний о максимальном количестве. Цель состоит в том, чтобы создать пакетный файл, чтобы удалить все значения «Найти *», не зная заранее максимального значения.

Я пробовал следующее с максимальным числом= 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"

Я хотел бы захватить этов переменной и проверьте строку «Ошибка ....» и, если истина, завершите цикл. Я понятия не имею, как это сделать.

1 Ответ

1 голос
/ 14 апреля 2011

Вам необходимо заменить цикл 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 всегда оценивается как TRUE и выполняет GOTO соответственно.

Как только возникает ошибка при попытке удалить другое значение, выполняется команда SET Err=1 и, как следствие, мы покидаем цикл.


EDIT для запроса на изменение.

Чтобы учесть параметр 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
...