Я пробовал просить об этом один раз, но я думаю, что была некоторая путаница, поэтому я собираюсь попробовать эту свежую. Вот код:Reg Query script для пакетного скрипта
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set excluded=Microsoft MDOP Dell
set count=0
for /f "tokens=2,*" %%a in ('Reg Query %regVar% /S^|find " DisplayName" ^| findstr /v "%excluded%"') do (
set /a count+=1
setlocal EnableDelayedExpansion
for %%n in (!count!) do (
endlocal
set product[%%n]=%%b
echo %%n.%tab%%%b
echo %%a
)
)
Что это делает пройти через все деинсталляции регистров, а затем добавляет каждый ключ DisplayName в массив под названием продукта [], а затем выводит результат для текущего номера это на I цикл в экран для меню. Что вы тогда можете сделать, это ввести номер и возвращает отображаемое имя в этом массиве:
Так что это, как он стоит отфильтровывает все майкрософт, MDOP и лощина
Что я хочу, чтобы это сделать, ТАКЖЕ загляните в этот ключ для этого DisplayName и верните еще один ключ с именем UninstallString и назначьте его массиву uninstallprod [] с тем же связанным индексом. Проблема я бегу в том, что я не могу понять, как любой запрос с помощью инструкции, как вы можете в SQL
Select UninstallString from REGISTRY where DisplayName="Program name"
с именем программы, являющейся возвращаемая строка из DisplayName вы выбрали, или иметь один запрос, который позволит мне отфильтровать отображаемые имена, как вы видите выше, а также включить значение UninstallString в том же самом выражении. Проблема с попыткой его каким-либо другим способом заключается в том, что я не могу отфильтровать и делать оба массива без его полного отказа от индексов (он пропустит отображаемое имя, но все же назначит деинструмент, потому что он не позволяет мне фильтровать оба)
UPDATE:
на данный момент у меня есть он отходил как в DisplayName и строку Uninstall, но это не наступающей счетчика правильно. В текущем состоянии он присваивает 2 переменные, имя ключа (%% a), используемое для назначения и сравнения того, что принадлежит ключу, и значение ключа (%% c), которое является либо именем программы или путь удаления (строка), который будет использоваться для удаления позже в скрипте. Итак, что происходит, так это то, что я заканчиваю список пропущенных чисел, потому что счетчик становится продвинутым, даже когда в списке нет отображаемого имени. Вот код, с которым я сейчас работаю.
@echo off
set tab=
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set excluded=Microsoft MDOP Dell
set count=1
for /f "tokens=1,2,*" %%a in ('Reg Query %regVar% /S^|findstr "DisplayName UninstallString" ^| findstr /v "%excluded%"') do (
setlocal EnableDelayedExpansion
for %%n in (!count!) do (
endlocal
if "%%a"=="DisplayName" set product[%%n]=%%c&echo %%n.%tab%%%c
if "%%a"=="UninstallString" if defined product[%%n] set uninstall[%%n]==%%c&set/a count+=1
)
)
Как пример, у меня есть Sublime Text 2.0.1 и 64-разрядный установщик компонентов HP CIO в моем списке. Что в конце концов происходит, я получаю список, как это:
1. Sublime Text 2.0.1
3. 64 bit HP CIO Components Installer
Так почему счетчик становится выдвинутую в прошлом не 2, даже если нет продукта [2] в настоящее время определяется. И в 32-разрядной версии я 5 записей показ, один из них является пустым, которая печатает так:
1. Adobe Flash Player 11 ActiveX
2. Google Chrome
3. TeamViewer 8
4.
4. Google Update Helper.
Ряд проблем - «некоторые», из которых я вчера занимался моим обновлением. Возможно, DisplayName появится после UninstallString (может быть). Может быть несколько строк Uninstall (возможно, возможно отфильтровать «REG_EXPAND_SZ»?), А Quietuninstallstring также проходит через фильтр. Поскольку вы не устанавливаете «SETLOCAL» в начале вашей партии, последующие прогоны работают с грязной средой - значения, установленные вами, являются ясными. Обратите внимание, что мои «исключения» различны - «Microsoft» часто встречается на пути удаления и, следовательно, незаконно исключается. – Magoo