2013-04-10 6 views
0

Так что, не доводя до свернутого, суть того, что я пытаюсь выполнить, заключается в том, что в настоящее время я перечисляю результаты запроса reg из отображаемого имени программ, назначая номер к нему, а затем называть его по номеру. Когда он перечисляет результаты, он затем использует findstr для фильтрации определенных программ (таких как что-либо с микрософт в нем) из списка, потому что я не хочу, чтобы они даже были вариантом для удаления. Сейчас она работает в основном, за исключением того, что возвращает так:Тестирование, если Reg Query является конкретным значением в пакетном скрипте

Let's say the programs in the Registry are: 
Microsoft Update (should be filtered) 
Notepad 
Java 
Microsoft Word (should be filtered) 
Yahoo Toolbar 

Когда я запускаю это:

: progList64 
cls 
set regVar=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 
set opt=64 
echo _______________________________________________________ 
echo. 
echo Please wait while I compile a list of known programs... 
echo _______________________________________________________ 
echo. 
echo %tab%64bit Programs 
echo Index%tab%Name 
set count=0 
for /f "tokens=2,*" %%a in ('Reg Query %regVar% /S^|find " DisplayName"') do (
    set /a count+=1 
    setlocal EnableDelayedExpansion 
    for %%n in (!count!) do (
     endlocal 
     set product[%%n]=%%b 
     echo %%n.%tab%%%b | findstr /V /C:"Microsoft" | findstr /V /C:"Dell" | findstr /V /C:"MDOP" | findstr /V /C:"MED" 
    ) 
) 
echo _______________________________________________________ 
echo. 
echo ============ PRESS 'M' TO GO TO MAIN MENU ============= 
echo. 
goto uninstallerMenu 

я получаю это:

2. Notepad 
3. Java 
5. Yahoo Toolbar 

Так позже, когда я звоню из массива вы действительно можете поставить 1 или 4 и выбрать этот продукт, даже если он не отображается. Я пытаюсь фильтровать его, прежде чем он печатает, что он печатает только то, что я хочу, в результате чего в этом:

1. Notepad 
2. Java 
3. Yahoo Toolbar 

Я пытаюсь с помощью различных IF заявления, пытался положить цельные для %% п в (кол! !) в выражении IF, который проверяет, находятся ли Microsoft, dell и т. д. в DisplayName, а затем отображает и увеличивает счетчик, если он подходит, но это тоже не работает. Я нахожусь здесь на уме, какие-то идеи?

И несвязанный и не очень важный, но кто-нибудь знает лучший способ фильтрации, а не daiychaining целый ряд утверждений findstr? Как список исключений или что-то еще?

ответ

1

В быстрой догадке, попробуйте перед циклом FOR, (скажем, после SET COUNT...)

set excluded=Microsoft Dell MDOP MED 

Затем каскада

|findstr /v "%excluded%" 

после FIND " Displayname"

Это следует отфильтровать слов, разделенных пробелами, в excludeme

Ваш существующий каскадный findstr может быть удален, поскольку эти имена удаляются перед вашим внутренним циклом for и, следовательно, также не будут получать число.

см. findstr /?

из командной строки для docco ...

+0

прекрасно работает, только вопрос есть несколько программ, которые имеют пробела в них (т.е. Configuration Manager Client), который я хочу, чтобы исключить, но не хочу, чтобы исключить каждый программа с конфигурацией слов или менеджером или клиентом. Также, как насчет пробелов? Просто используйте пустые кавычки? – Flynn

+0

cascade a 'findstr/v/i/c:" диспетчер конфигурации "после" ... "% excludeme%" '. '/ C' заставляет' findstr' искать точно указанные слова - включая пробел./I вы можете или не хотите - делает тест нечувствительным к регистру. – Magoo

+0

Удивительный, отлично работает! Спасибо – Flynn

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

  • Нет связанных вопросов^_^