2013-04-12 2 views
2

Я пробовал просить об этом один раз, но я думаю, что была некоторая путаница, поэтому я собираюсь попробовать эту свежую. Вот код: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. 
+0

Ряд проблем - «некоторые», из которых я вчера занимался моим обновлением. Возможно, DisplayName появится после UninstallString (может быть). Может быть несколько строк Uninstall (возможно, возможно отфильтровать «REG_EXPAND_SZ»?), А Quietuninstallstring также проходит через фильтр. Поскольку вы не устанавливаете «SETLOCAL» в начале вашей партии, последующие прогоны работают с грязной средой - значения, установленные вами, являются ясными. Обратите внимание, что мои «исключения» различны - «Microsoft» часто встречается на пути удаления и, следовательно, незаконно исключается. – Magoo

ответ

2

Вы должны были бы позволить как «UninstallString» и «DisplayName» через начальную ворота, так изменить

для/ф "токенов = 2 *" %% а в ('Reg Query% regVar%/S^| найти "DisplayName"»...

в

для/f "tokens = 1,2, *" %% a in ('Reg Query% regVar%/S^| FINDSTR "Отображаемое имя UninstallString" ...

Который установит %%a в Displayname или UninstallString и %%c к требуемому значению данных.

ТОГДА вам приходится иметь дело с последовательностью

DISPLAYNAME х
DISPLAYNAME у
Uninstall у

или

DISPLAYNAME у
Uninstall у
Uninstall г

Какие на самом деле не является частью жестко.

Вы уже установили Product [n] - вам нужно сделать это для каждого %%a == Отображаемое имя. Повторите для удаления [n] - сделайте это для каждого %%a == UninstallString, но только если Product [n] определен.

IF "%%a"=="UninstallString" if defined Product[%%n] set uninstall[%%n]=%%c&set/a count+=1 

взять отсчет приращение до SETLOCAL наружу, как это должно быть сделано, только если у вас есть соответствующие пары продукта и УДАЛЕНИЕ; изменить начальное значение 1 (если вы не хотели, считая от нуля)

и молитесь, чтобы не получить последовательность

DISPLAYNAME у
Uninstall г

Теперь, если вы получите эту последовательность , просто найдите удобную строку, чтобы ТАКЖЕ пропустить через ворота - например, «HKEY_», и если %%a начинает «HKEY_», то set "Product[%%n]=", чтобы очистить любое отображаемое имя без деинсталляции.

Возможно, вы захотите немного изменить это.

Если вы установили

  • продукта против первого DISPLAYNAME
  • деинсталляции против строки первого удаления (то есть. Только if not defined unistall[%%n])
  • Когда появляется HKEY_, приращение счетчика, если оба продукта [%% п] и деинсталлировать [%% п] определены, иначе установить продукт [%% п] и удалите [%% п] к [ничего]

то последовательность удаления и DisplayName не имеет значения, хотя вам нужно повторить тест HKEY_ после цикла, чтобы заботиться о самой последней инстанции ...


Приложение для решения некоторых проблем обсудили

@ECHO OFF 
setlocal 
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 
set excluded=/c:" Microsoft" /c:"MDOP" /c:"Dell" 
set count=1 
for /f "tokens=1,2,*" %%a in ('Reg Query %regVar% /S^|findstr "DisplayName HKEY_ UninstallString" ^| findstr /v %excluded%') do (
    setlocal EnableDelayedExpansion 
    for %%n in (!count!) do (
     ENDLOCAL 
     SET HKEY=Y 
     IF "%%a"=="DisplayName" SET "HKEY="&set product[%%n]=%%c 
     IF "%%a"=="UninstallString" SET "HKEY="&IF NOT DEFINED uninstall[%%n] set uninstall[%%n]=%%c 
     IF "%%a"=="QuietUninstallString" SET "HKEY="&IF NOT DEFINED uninstall[%%n] set uninstall[%%n]=%%c 
    IF DEFINED hkey IF DEFINED product[%%n] IF defined uninstall[%%n] SET /a count+=1&SET "hkey=" 
    IF DEFINED hkey set "product[%%n]="&SET "uninstall[%%n]=" 
    ) 
) 

:: 
:: Last entry may not be complete 
:: 
IF NOT DEFINED product[%count%] SET "uninstall[%count%]="&SET /a count-=1 
IF NOT DEFINED uninstall[%count%] SET "product[%count%]="&SET /a count-=1 

ECHO %count% entries found 
SET prod 
SET unins 

Обратите внимание, что поскольку HKEY теперь разрешается через ворота, но это боль, чтобы проверить line beginning HKEY, если это не одна из строк «DisplayName», «UninstallString» или «QuietUninstallString», то это предполагается быть HKEY. IF DEFINED работает с RUN-TIME наличием/отсутствием переменной, которая позволяет упростить программирование.


Показать данные из "массива"

FOR /l %%i IN (1,1,%count%) DO (
CALL ECHO %%i. %%product[%%i]%% 
) 

Дополнительные данные 20130419-1756Z

@echo OFF 
setlocal 
set tab=  
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 
set excluded=Microsoft MDOP Dell 
FOR /f "delims=" %%i IN ('Reg Query %regVar% /S^|find "HKEY_"') DO (
FOR %%s IN (dn us qu pu dn ut) DO SET "%%s=" 
FOR /f "tokens=1,2,*delims= " %%s IN ('Reg Query "%%i" /S') DO (
    if /i "%%s"=="Displayname" SET /a dn+=1&SET dn=%%u 
    if /i "%%s"=="Uninstallstring" SET /a us+=1&SET ut=%%u 
    if /i "%%s"=="quietUninstallstring" SET /a qu+=1 
    if /i "%%s"=="publisher" SET pu=%%u 
) 
FOR %%s IN (dn us qu) DO SET /a %%s+=0 
CALL :report 
) 

GOTO :eof 

:report 
SET /a tus=us+qu 
ECHO %dn% %us% %qu% %tus% %pu% %dn% %ut% 
GOTO :eof 

Эта процедура должна показать интересные детали.

Столбцы отчета являются

  1. Количество 'DISPLAYNAME нашли
  2. Количество' UninstallString нашла
  3. число «quiteuninstallstring обнаружили
  4. всего 2 предыдущих колонок
  5. издатель строки - если Найдено
  6. displayname - если найдено
  7. удалить текст - если найдено

Я предлагаю вам использовать эти данные для фильтрации и присвоения массиву - внутренний цикл имеет дело с одним элементом удаления. Выберите нужные детали и добавьте их или не используйте свои массивы.

+0

ДА! это то, что я хотел сделать, я попробую это, как только вернусь к этой сети. Вопрос, хотя те исключения, которые работают в DisplayName, будут все еще исключать их? или это исключает все вхождения этих слов из uninstallstring и displayname? – Flynn

+0

Итак, я добавил UninstallString, теперь он фактически продвигает счетчик между DisplayName и UninstallString. Таким образом, это скажет 1.DisplayName 2.UninstallString, вместо того, чтобы я мог вызывать оба в этом нижнем для цикла одновременно. Итак, как это структурировано сейчас, есть имя, тип и данные в регистре. Он возвращает %% a = DisplayName Type и %% b = DisplayName Data. Я надеялся, что вызов обоих даст мне %% c = UninstallString Type и %% D = UninstallString Data. Но вместо этого он продвигается и чередует пары %% a/%% b для DisplayName, а затем другую пару %% a/%% b для UninstallString. – Flynn

+0

И еще одна вещь, которая происходит, заключается в том, что теперь она возвращает ВСЕ удаляемые строки независимо от того, возвращается ли DisplayName. – Flynn

Смежные вопросы