2015-11-20 6 views
-2

Я пытаюсь написать пакетный скрипт, который будет искать реестр и добавить значение UninstallString в ключ в переменную.
Есть несколько предостережений:
1. Клавиши могут отличаться на разные рабочих станциях (в зависимости от используемого установщика, существуют несколько модифицированных версий MSI для samesoftware версии)
2. Существует основной продукт с заплатками, установленных
- . пластыри должны быть удалены, прежде чем основной продуктПакетный файл: поиск реестра и множество переменных

Например, программное обеспечение Cisco Supervisor Desktop может иметь следующие ключи:

Patch 3
KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall {981E3887-9D55-4B91-B643-7155AA98C906}
значение отображаемое_имя Desktop Services Cisco 8,5 (4) Maintenance Release 4 Engineering Special 6
значение UninstallString: MsiExec.exe/X {981E3887-9D55-4B91-B643-7155AA98C906}

Patch 2
KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall {4FA5AFA8 -FDEB-43C9- 83B7-43092593ACDF}
значение отображаемое_имя Desktop Services Cisco 8,5 (4) Maintenance Release 4 Engineering Special 4
значение UninstallString: MsiExec.exe/X {4FA5AFA8-FDEB-43C9-83B7-43092593ACDF}

Patch 1:
KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall {CA941834-837E-44C2-BF83-E7E7558FDD61}
Выводимое значение: Услуги Cisco Desktop 8.5 (4) Техническое обслуживание Выпуск 4
UninstallString значение: MsiExec.exe/Х {CA941834-837E-44C2-BF83-E7E7558FDD61}

Основной продукт:
Ключ: HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall
значение отображаемое_имя Cisco Supervisor Desktop
значение UninstallString: MsiExec.exe/X {AB60EBDC-45A9- 4764-96CB-EFCE4AD0C10B}

Их необходимо удалить в указанном порядке. Также существует вероятность того, что другие ключи будут в реестре, когда будут установлены несколько версий.

Я бы подумал, что для патчей можно использовать функцию поиска с использованием значения DisplayName для служб Cisco Desktop, поскольку для всех патчей это обычный поиск агента Cisco Supervisor.

В настоящее время у меня есть команды WMIC, но иногда они могут быть очень медленными для запуска, а если я вручную запустил значение UninstallString, оно будет завершено быстро. У меня также были экземпляры, когда команда WMIC не удаляет продукт, когда значение UninstallString будет.

Любая помощь будет оценена, если это возможно.

+1

'reg' Служебный метод основан самый быстрый действительно, взгляните на [Как я могу автоматически удалить все программы, содержащие «VNC», в их отображаемом имени, используя пакетный файл?] (http://stackoverflow.com/a/33279973), если вы можете настроить его самостоятельно, – wOxxOm

+0

Thank вы. Это, похоже, отлично подходит для поиска строк удаления. Знаете ли вы, как устроить удаленные объекты, чтобы они были удалены в определенном порядке? –

+0

Я предполагаю, что может быть много способов. Например, вы можете создать «массив» со всеми целями удаления – wOxxOm

ответ

0

@wOxxOm
(Это длинный комментарий не является ответом.) Спасибо за ваше предложение. К сожалению, я никогда не был так глубоко в пакетном кодировании. Но я взял ваш код, изменил его и смог экспортировать списки DisplayName и UninstallString в текстовые файлы. Я также смог правильно отсортировать список DisplayName, но я не смог получить соответствующий UninstallString для сортировки в одном порядке. Например, несортированный список DisplayName указан как 2, 3, 1. Я могу получить его отсортированным как 3, 2, 1, используя sort /r. Но если я отсортировать UninstallString список с sort /r я получить отсортированный список 1, 3, 2.

app.txt  
2 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 4 
3 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 6 
1 Cisco Desktop Services 8.5(4) Maintenance Release 4 

app_sorted.txt 
3 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 6 
2 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 4 
1 Cisco Desktop Services 8.5(4) Maintenance Release 4 

un.txt  
2 MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 
3 MsiExec.exe /X{981E3887-9D55-4B91-B643-7155AA98C906} 
1 MsiExec.exe /X{CA941834-837E-44C2-BF83-E7E7558FDD61} 

un_sorted.txt  
1 MsiExec.exe /X{CA941834-837E-44C2-BF83-E7E7558FDD61} 
3 MsiExec.exe /X{981E3887-9D55-4B91-B643-7155AA98C906} 
2 MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 

The un_sorted.txt needs to be:  
3 MsiExec.exe /X{981E3887-9D55-4B91-B643-7155AA98C906} 
2 MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 
1 MsiExec.exe /X{CA941834-837E-44C2-BF83-E7E7558FDD61} 

знака # в начале каждой строки является порядок первоначальной установки, поскольку они должны быть удалены в обратный порядок. # Для ссылки.

Я хотел бы иметь возможность сделать это без файлов txt, если это возможно.

Благодаря

Вот измененный код:

@echo off 
setlocal enableDelayedExpansion 
::Build array 
for %%a in ("" "\Wow6432Node") do (
    for /f "delims=" %%b in (' 
     reg query HKLM\SOFTWARE%%~a\Microsoft\Windows\CurrentVersion\Uninstall^
      /s /d /f "Cisco Desktop" ^| findstr "HKEY_ DisplayName" ^| sort /r 
    ') do (
     set "line=%%b" 
     if "!line:~0,4!"=="HKEY" (
      set "key=!line!" 
     ) else (
      set Uninstall= 
      rem Sort /r makes QuietUninstallString the last line 
      for /f "tokens=2*" %%c in (' 
       reg query "!key!" ^| find "UninstallString" ^| sort /r 
      ') do if not "%%d"=="" set "Uninstall=%%d" 

      if defined Uninstall (
       for /f "tokens=2*" %%c in ("!line!") do (
       set app=%%d 
       echo !app! >> C:\Test\app1.txt 
       echo !app!,!Uninstall! >> C:\Test\un1.txt 
       ) 
      ) 
     ) 
    ) 
) 
sort /r <C:\Test\app.txt> C:\Test\app_sorted.txt 

EDIT: Если я ^| sort /r к DisplayName находят линии, я получу DisplayName результаты Я ищу, но он повторяет то же самое UninstallString для каждого DisplayName в списке:

un.txt 
3 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 6,MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF}  
2 Cisco Desktop Services 8.5(4) Maintenance Release 4 Engineering Special 4,MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF}  
1 Cisco Desktop Services 8.5(4) Maintenance Release 4,MsiExec.exe /X{4FA5AFA8-FDEB-43C9-83B7-43092593ACDF} 
+0

Я знаю, что я мог бы добавить DisplayName в список справа в скрипте и будет работать отлично, но это не поможет для тех рабочих станций, у которых установлена ​​более старая версия и я, возможно, не знаю этого списка, не глядя на него. Тогда мне придется изменить скрипт для другого списка. Не то, что я хочу делать. –

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