2013-07-16 5 views
0

Я хотел бы искать эти ключи реестра (возможно, с "REG Query") :партия UninstallString рег запрос

HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall

HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall

и "Найти" или "Findstr" конкретных переменных и показать результаты (эхо?)

Этот сценарий своего рода делает то, что я хотел бы достичь * : *

@ECHO OFF 
:: Windows 7 only 
IF NOT "%OS%"=="Windows_NT" GOTO Syntax 
VER | FINDSTR /R /E /C:" 6\.[01]\.[0-9\.]*\]" >NUL || GOTO Syntax 

:: Check command line arguments 
IF  "%~1"=="" GOTO Syntax 
IF NOT "%~2"=="" GOTO Syntax 
ECHO "%~1" | FINDSTR /R /C:"[/?]" >NUL && GOTO Syntax 

SETLOCAL ENABLEDELAYEDEXPANSION 
SET Count=0 
FOR /F "tokens=*" %%A IN ('REG Query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /F "%~1" /D /S 2^>NUL ^| FINDSTR /R /B /C:"HKEY_"') DO (
    REG Query "%%~A" /F DisplayName /V /E | FINDSTR /R /I /C:" DisplayName .* .*%~1" >NUL 2>&1 
    IF NOT ERRORLEVEL 1 (
     SET /A Count += 1 
     FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F DisplayName /V /E 2^>NUL ^| FIND /I " DisplayName "')  DO ECHO Program Name  = %%C 
     FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F DisplayVersion /V /E 2^>NUL ^| FIND /I " DisplayVersion "') DO ECHO Program Version = %%C 
     FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F InstallDate /V /E 2^>NUL ^| FIND /I " InstallDate "')  DO (
      SET InstallDate=%%C 
      ECHO Install Date  = !InstallDate:~0,4!-!InstallDate:~4,2!-!InstallDate:~6! 
     ) 
     FOR /F "tokens=7 delims=\" %%B IN ("%%~A") DO ECHO Unique Identifier = %%B 
     FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F UninstallString /V /E ^| FIND /I " UninstallString "') DO ECHO Uninstall String = %%C 
     ECHO. 
    ) 
) 

WMIC.EXE Path Win32_Processor Get DataWidth 2>NUL | FIND "64" >NUL 
IF ERRORLEVEL 1 (
    ECHO. 
    ECHO %Count% programs found 
) ELSE (
    SET Count32bit=0 
    FOR /F "tokens=*" %%A IN ('REG Query HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall /F "%~1" /D /S 2^>NUL ^| FINDSTR /R /B /C:"HKEY_"') DO (
     REG Query "%%~A" /F DisplayName /V /E | FINDSTR /R /I /C:" DisplayName .* .*%~1" >NUL 2>&1 
     IF NOT ERRORLEVEL 1 (
      SET /A Count32bit += 1 
      FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F DisplayName /V /E 2^>NUL ^| FIND /I " DisplayName "')  DO ECHO Program Name  = %%C 
      FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F DisplayVersion /V /E 2^>NUL ^| FIND /I " DisplayVersion "') DO ECHO Program Version = %%C 
      FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F InstallDate /V /E 2^>NUL ^| FIND /I " InstallDate "')  DO (
       SET InstallDate=%%C 
       ECHO Install Date  = !InstallDate:~0,4!-!InstallDate:~4,2!-!InstallDate:~6! 
      ) 
      FOR /F "tokens=7 delims=\" %%B IN ("%%~A") DO ECHO Unique Identifier = %%B 
      FOR /F "tokens=2*" %%B IN ('REG Query "%%~A" /F UninstallString /V /E ^| FIND /I " UninstallString "') DO ECHO Uninstall String = %%C 
      ECHO. 
     ) 
    ) 
    ECHO. 
    ECHO  %Count% 64-bit programs and !Count32bit! 32-bit programs found 
) 

ENDLOCAL 
GOTO:EOF 


:Syntax 
ECHO. 
ECHO GetUninstall.bat, Version 2.00 for Windows Vista and later 
ECHO List or search uninstall command lines 
ECHO. 
ECHO Usage: GETUNINSTALL.BAT "filter" 
ECHO. 
ECHO Where: "filter" narrows down the search result to programs whose 
ECHO      uninstall data contains the string "filter" 
ECHO. 
ECHO Example: GETUNINSTALL.BAT "Adobe Reader" 
ECHO. 
ECHO Written by Rob van der Woude 
ECHO http://www.robvanderwoude.com 

:: Set return code for Windows NT 4 or later 
IF "%OS%"=="Windows_NT" COLOR 00 

ПРОБЛЕМА:

Это действительно показывает все найденные uninstallstrings, как указано в "% 1" и работает с «Windows 7 PRO SP1" , но не с „Windows XP Pro SP3“, и я не могу получить эту работу на XP ...

REM IF NOT "%OS%"=="Windows_NT" GOTO Syntax 
REM VER | FINDSTR /R /E /C:" 6\.[01]\.[0-9\.]*\]" >NUL || GOTO Syntax 

/\, и это не так просто, конечно ;-p/\

ответ

0

Почему вы это делаете сами? Ваш код в VBScript:

Set re = New RegExp 
re.Pattern = "(\d{4})(\d{2})(\d{2})" 

Set wmi = GetObject("winmgmts://./root/cimv2") 
For Each p In wmi.ExecQuery("SELECT * FROM Win32_Product") 
    WScript.Echo "Program Name  = " & p.Name & vbNewLine _ 
    & "Program Version = " & p.Version & vbNewLine _ 
    & "Install Date  = " & re.Replace(p.InstallDate, "$1-$2-$3") & vbNewLine _ 
    & "Unique Identifier = " & p.IdentifyingNumber 
Next 

Ваш код в PowerShell:

gwmi Win32_Product | select Name, Version, InstallDate, IdentifyingNumber | % { 
    "Program Name  = " + $_.Name 
    "Program Version = " + $_.Version 
    "Install Date  = " + ($_.InstallDate -replace '(\d{4})(\d{2})(\d{2})', 
                '$1-$2-$3') 
    "Unique Identifier = " + $_.IdentifyingNumber 
} 

Извлечение строки деинсталлировать потребует немного больше усилий, но что вам нужно, что для так или иначе? Если вы хотите удалить программу: класс WMI предоставляет метод Uninstall.

+0

i.e wmic product где "name like" Java 7 %% '"call uninstall/nointeractive ??? это то, что вы, вероятно, имеете в виду? Но это вызывает перезагрузку с некоторыми ударами, и это не то, что я хочу. Или может быть, способ подавить это от происходящего? – APOC

+0

Он должен быть похож на вызов 'wmic', да. Что касается принудительной перезагрузки, это зависит от программы. Однако вы всегда можете создать пользовательскую строку удаления с помощью GUID ('IdentifyingNumber'). –

+0

Когда я добавляю shutdown/a после последнего wmic, я не получаю перезагрузку, не уверен, что это лучший способ, НО он вытащит «трюк» – APOC

1

Это почти делает, как и ожидалось:

@ECHO OFF 
SETLOCAL ENABLEEXTENSIONS 
REM SETLOCAL ENABLEDELAYEDEXPANSION 
CLS 
echo.Tim: uninstall (old/previous) Adobe ShockWave/Flash... 

CALL "\\dc01.lksvdd.local\netlogon\Log_management.bat" >nul 2>&1 

:: RUN_Once 
IF NOT EXIST "%systemroot%\LOGS\LKSVDD\Tim\uninstall_(shockwave)flash_12+11.txt" (GOTO Uninstall_Adobe-Addons) ELSE GOTO:EOF 
GOTO:EXIT 


:Uninstall_Adobe-Addons 
rem uninstall old adobe shockwave/flash installations; new adobe shockwave/flash setup pushed with GPO... 

wmic product where "name like 'Adobe Flash Player 11%%'" call uninstall /nointeractive  > "%systemroot%\LOGS\LKSVDD\Tim\uninstall_(shockwave)flash_12+11.txt" 2>&1 
wmic product where "name like 'Adobe Flash Player 10%%'" call uninstall /nointeractive   > "%systemroot%\LOGS\LKSVDD\Tim\uninstall_(shockwave)flash_12+11.txt" 2>&1 
wmic product where "name like 'Adobe Shockwave Player 12%%'" call uninstall /nointeractive >> "%systemroot%\LOGS\LKSVDD\Tim\uninstall_(shockwave)flash_12+11.txt" 2>&1 
wmic product where "name like 'Adobe Shockwave Player 11%%'" call uninstall /nointeractive  >> "%systemroot%\LOGS\LKSVDD\Tim\uninstall_(shockwave)flash_12+11.txt" 2>&1 

rem Abort possible ShutDown.................. 
"%windir%\system32\shutdown.exe" /a >nul 2>&1 


:EXIT 
ECHO #runTimeStamp -4- "uninstall_adobe-addons.cmd" [%DATE% %TIME%] EOF >> "%systemroot%\LOGS\LKSVDD\Tim\uninstall_(shockwave)flash_12+11.txt" 2>&1 

rem echo. 
REM script date: 16-07-2013 
rem echo. 
rem PAUSE 
ENDLOCAL 
GOTO:EOF 

"Adobe Flash Player" не получить деинсталлировать/удалить, НО "Adobe Flash Player" не ??? это правильное описание программы, но по какой-то причине оно не узнается, но не понятно почему?

+0

Возможно, только WMIC работает для программ, которые были установлены через соответствующий пакет MSI ??? Я все еще получаю много: ,, Нет доступных экземпляров ''> :( – APOC

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