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 ステートメントを使用して試してみました。Microsoft、dell などが DisplayName に含まれているかどうかをテストする IF ステートメントの (!count!) 部分に %%n の全体を入れてみました。適合しますが、それも機能していません。私はここで頭がいっぱいです、何かアイデアはありますか?

無関係であまり重要ではありませんが、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 に答える