0

因此,无需复杂,我要完成的要点是,我目前正在按程序的显示名称列出 reg 查询的结果,为其分配一个数字,然后稍后按数字调用它。当它列出结果时,它会使用 findstr 从列表中过滤特定程序(例如其中包含 microsoft 的任何程序),因为我什至不希望它们成为卸载的选项。现在它基本上可以工作,除了它返回如下:

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 语句,尝试将整个 for %%n in (!count!) 部分放在一个 IF 语句中,该语句测试 Microsoft、dell 等是否在 DisplayName 中,然后只显示和增加计数器如果它适合,但这也不起作用。我的智慧到此为止,有什么想法吗?

并且不相关并且不是很重要,但是有没有人知道更好的过滤方法,而不是每天链接整行 findstr 语句?像排除列表之类的?

4

1 回答 1

1

快速猜测一下,在FOR循环之前尝试(比如在 之后SET COUNT...

set excluded=Microsoft Dell MDOP MED

然后级联

|findstr /v "%excluded%"

之后FIND " Displayname"

这应该过滤掉任何空格分隔的单词excludeme

findstr然后可以删除您现有的级联,因为这些名称在您的内部for循环之前被删除,因此也不会获得数字。

见 findstr /?

从 docco 的提示...

于 2013-04-10T17:41:36.857 回答