If statement 测试Reg查询是否是批处理脚本中的特定值

If statement 测试Reg查询是否是批处理脚本中的特定值,if-statement,batch-file,findstr,If Statement,Batch File,Findstr,因此,在不费解的情况下,我试图实现的要点是,我目前正在按程序的显示名称列出reg查询的结果,给它分配一个数字,然后稍后按数字调用它。当它列出结果时,它会使用findstr从列表中筛选特定的程序(例如任何包含microsoft的程序),因为我甚至不希望它们成为卸载的选项。现在它基本上是工作的,除了它返回如下: Let's say the programs in the Registry are: Microsoft Update (should be filtered) Notepad Java

因此,在不费解的情况下,我试图实现的要点是,我目前正在按程序的显示名称列出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放入(!count!)部分的IF语句中,测试DisplayName中是否有Microsoft、dell等,然后仅在合适时显示和增加计数器,但这也不起作用。我在这里束手无策,有什么想法吗


不相关也不重要,但有人知道比每天链接一整行findstr语句更好的过滤方法吗?像排除列表之类的?

快速猜一猜,在
FOR
循环之前尝试(比如在
设置计数之后…

然后级联

|findstr /v "%excluded%"
之后查找“Displayname”

这将过滤掉
excludeme

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

看 findstr/


从docco的提示中…

效果很好,唯一的问题是有两个程序中有空格(即Configuration Manager Client),我想排除这些空格,但不想排除其中包含Configuration或Manager或Client字样的每个程序。还有,空白的名字呢?只需使用空引号?在
之后级联一个
findstr/v/i/c:“配置管理器”
。“%excludeme%”
/c
使
findstr
精确查找指定的单词,包括空格。您可能想要或不想要的/i-使测试不区分大小写。@Flynn-使用多个搜索字符串时,
/i
选项对于避免严重的FINDSTR错误非常关键,该错误可能导致未匹配。有关更多信息,请参阅和/或。但仍然无法正常工作的一件事是测试字符串是否为空。所有的排除都很有效,但是如何过滤掉一个空结果呢?有一个随机的microsoft程序没有显示名,所以我想将它与其他名称一起过滤掉。你是说
%%b
可能为空?我的方法是在
do
之间添加
set dispname=%%b&如果定义了dispname
在您的
中,对于/f...%%a(它作用于变量的运行时值)。现在-这也假设
%%b
设置为[nothing],而不是一个或多个空格。。。
|findstr /v "%excluded%"