2013-04-11 3 views
0

То, что я пытаюсь сделать, - это пакетный скрипт, который возвращает ссылку удаления для программы. Поэтому в основном я хочу что-то вроде этого:reg запрашивает значение ключа на основе другого значения ключа

Select UninstallString from HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall where DisplayName='Sublime Text 1.0" 

Я использую

reg query HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall /S^|find " DisplayName" 

сначала получить список программ, которые затем получить положить в меню, то я выбираю программу для удаления и он должен идти в реестр этой программы в HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall и получить его значение UninstallString

+1

Так что конкретно проблема? –

+0

У меня есть список программ, и я хочу выбрать UninstallString из реестра, который соответствует определенному DisplayName? Я не уверен, что еще вы ищете, я думал, что я был довольно специфичен там, предоставив вам точный пример sql и запросив эквивалент запроса REG – Flynn

ответ

1

Попробуйте это:

@echo off&setlocal enabledelayedexpansion 
set "regroot=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" 
set "file=%~dpn0.txt" 

set /a fcount=0 
for /f "delims==" %%i in ('set $ 2^>nul') do set "%%i=" 
if exist "%file%" (
    for /f "usebackqtokens=1*delims=|" %%i in ("%file%") do (
     set /a fcount+=1 
     set "$d%%j=%%j" 
     set "$u%%j=%%i" 
    ) 
    goto:menu 
) 
echo(building "%file%", please wait 
for /f "delims=" %%i in ('reg query "%regroot%"') do (
    set "DN="& set "US=" 
    for /f "tokens=2*" %%j in ('reg query "%regroot%\%%~ni" /v DisplayName 2^>nul^|find /i "DisplayName"') do set "DN=%%~k" 
    for /f "tokens=2*" %%j in ('reg query "%regroot%\%%~ni" /v UninstallString 2^>nul^|find /i "UninstallString"') do set "US=%%~k" 
    if not "!DN!"=="" if not "!US!"=="" if not defined $d!DN! (
     >>"%file%" echo(!US!^|!DN! 
     set /a fcount+=1 
     set "$d!DN!=!DN!" 
     set "$u!DN!=!US!" 
     <nul set/p"=." 
    ) 
) 
echo(
:menu 
echo(%fcount% programs with uninstall strings found. 
:loop 
set /a pcount=0 
set "program=" 
set /p "program=type a program name (q=quit): " 
if not defined program goto:loop 
if "%program%"=="q" goto:eof 
echo(
for /f "tokens=2delims==" %%i in ('set $d ^|findstr !program! 2^>nul') do (
    echo(%%i 
    echo(!$u%%i! 
    echo(
    set /a pcount+=1 
) 
if %pcount% equ 0 (echo(!program! not found.) else echo(%pcount% program(s^) found. 
goto:loop 

Вы можете использовать некоторые функции REGEX findstr (например, /i для поиска без учета регистра). Обратите внимание: для поиска всех программ, начинающихся с «М», вы можете использовать "^$dM" или /b $dM. Строки, доступные для поиска, всегда являются ведущими $d.

+0

, так как именно я выбираю ТОЛЬКО программу, которую я хочу. Посмотрите, где я пытаюсь выбрать рег, где DisplayName является конкретным значением? – Flynn

+0

Просто часть информации, которую я забыл, которая может быть полезна, на самом деле я также исключаю элементы из списка, когда я нахожу DisplayName, поэтому я не могу сделать массив из двух строк, если UninstallString не пропущен вместе с DisplayName, которые не используются. – Flynn

+0

Что значит «выбрать программу»? Программа представляет собой DisplayName! Что еще? В какой информации скрывается имя прогаммы? Где это можно найти? Что такое «программа»? – Endoro

0

Попробуйте это "два-лайнер":

for /f "tokens=7 delims=\" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /S /F "MySoftware" ^| find "{"') do set ProgramUninstallRegKey=%%a 
for /f "skip=1 tokens=3*" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%ProgramUninstallRegKey% /V "UninstallString"') do set ProgramUninstallString=%%a %%b 
Смежные вопросы