Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как получить название раздела реестра и передать в переменную?

41K
25 февраля 2011 года
enothiz
11 / / 17.10.2008
добрый день. Возникла необходимость изобрести способ быстрого и, желательно, сайлент-мод удаления Symantec AV. Один вариант тяжеловесный, с использованием пакета msi (инсталлеру через exec передаётся название пакета) и другой вариант, требующий продакт-коде. Для определения этого продакт-коде предлагают просмотреть разделы, названия которых являются продакт-кодами в
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall.
Раздел, содержащий ключ DisplayName со значением Symantec Antivirus и является продакт-кодом симантека. к сожалению, у разных версий (сборок) этот самый продакт-код отличается, так что использовать один на всех не получится. Лазать руками на всех машинах неэргономично.

Вопрос: можно ли из батника (из командной строки) найти ключ по значению, определить название раздела содержащего этот ключ и передать это название в команду (при помощи переменной или ещё как).
278
25 февраля 2011 года
Alexander92
1.1K / / 04.08.2008
Вообще, в командном языке предусмотрена команда reg query, которая может запрашивать информацию обо всех разделах / подразделах реестре. Но единственное, поиск ключа по значению - вообще говоря, задача, которая занимает достаточно много времени и ресурсов + бат-файлы плохо приспособлены для обработки текстовой информации. Почему бы вам не подумать о реализации, например, на Windows Script Host? Он интегрирован в систему так же, как и бат-файлы, а штатных возможностей у него гораздо больше (в том числе, и касательно реестра тоже).
41K
25 февраля 2011 года
enothiz
11 / / 17.10.2008
reg query вываливает содержимое раздела без какой-либо обработки.
местные кодеры от vb кривятся и предлагают собрать екзешник в перле, когда нибудь
неприятность в том, что Product Code - это не значение параметра, а раздел, в котором всё содержится. Я не кодер, мне неочевидно, как так извернуться, чтобы это самое получить и сунуть в, например, start msiexec /x %1 /q /norestart
278
25 февраля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: enothiz
Product Code - это не значение параметра, а раздел, в котором всё содержится.


Тогда, возможно, я не совсем хорошо вас понял, что вам нужно. Что вам нужно найти - раздел по ключу, по значению или что-то еще?

7
25 февраля 2011 года
@pixo $oft
3.4K / / 20.09.2006
ИМХО,лучше всё же воспользоваться WSH,ибо
Цитата: enothiz
местные кодеры от vb кривятся…предлагают собрать екзешник в перле

какой-то фиговый аргумент.Тем более,когда-то может наступить тогда,когда вам это будет не надо
Либо пишите на к.-л. ЯП(если владеете,конечно).Ибо .bat слабоват для этого

278
25 февраля 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: enothiz
местные кодеры от vb кривятся


Раз уж на то пошло, то WSH - это не только VBS, но и JS.

405
01 марта 2011 года
Dmitrii
554 / / 16.12.2004
Цитата: enothiz
... Раздел, содержащий ключ DisplayName со значением Symantec Antivirus и является продакт-кодом симантека...

То есть нужное значение - это имя некоего подключа в ключе UNINSTALL ?

Сеть - доменная?
Версии ОС на станциях?

41K
01 марта 2011 года
enothiz
11 / / 17.10.2008
Цитата: Dmitrii
То есть нужное значение - это имя некоего подключа в ключе UNINSTALL ?

Сеть - доменная?
Версии ОС на станциях?



PDC на Gentoo, есть ещё OCS inventory, с помощью которого и предполагалось скормить воркстейшенам батник/скрипт. WinXP SP2-SP3, в основном последнее.

41K
01 марта 2011 года
enothiz
11 / / 17.10.2008
Цитата: Alexander92
Тогда, возможно, я не совсем хорошо вас понял, что вам нужно. Что вам нужно найти - раздел по ключу, по значению или что-то еще?


название подраздела (или ключа, я уже путаюсь в терминологии реестра, визуально в редакторе это выглядит как подраздел с параметрами внутри) по значению ключа,ключ DisplayName значение Symantec Antivirus

41K
01 марта 2011 года
enothiz
11 / / 17.10.2008
попался вот такой скрипт на forumRuboard:

Option Explicit 'all variables must be defined

Dim oReg, oShell, oFSO
Dim UninstallString, ProductCode, i
Dim strComputer, colItems, objWMIService, objItem
Dim strKeyPath, subkey, arrSubKeys
strComputer = "."

'********************************
'Enter Product Code Of The Application Here That You Want To Uninstall within the Bracket
ProductCode = "{50E125D1-88E5-48CE-80AE-98EC9698E639}"

'********************************

' Get scripting objects needed throughout script.
Set oShell = CreateObject("WScript.Shell")

'**************************
UninstallString = "MsiExec.exe /X" & ProductCode & " /qn" & " /norestart"

Const HKEY_LOCAL_MACHINE = &H80000002

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys

For Each subkey In arrSubKeys

IF subkey = ProductCode Then
i=0
i= oShell.Run(UninstallString, 1, True)
WScript.Quit(i)
End If

Next

Set oShell = Nothing
Set oReg = Nothing




'************* End Code ************

но я не програмист и не уверен в результате, мне показалось, что он проверяет, есть ли продакт-код, жёстко заданный ( у нас не такой, ибо версия AV другая). Если кто-нибудь прокомментирует, буду признателен.
277
01 марта 2011 года
arrjj
1.7K / / 26.01.2011
Вобщем 2 батника нужно использовать.
1-й батник
 
Код:
@echo off

for  /F "tokens=*" %%i in ('reg query hklm\software\microsoft\windows\currentversion\uninstall /s /f "Microsoft Visual C++ 2008 Redistributable" /t REG_SZ') do (

call qwe2.bat "%%i"

)

Тут Microsoft Visual C++ 2008 Redistributable замените на Symantec Antivirus
2-й батник (qwe2.bat из предыдущего батника)
 
Код:
@echo off

set verysome=%1

if "%verysome:~1,4%"=="HKEY" echo %verysome:~72,38%

set verysome=

тут вместо echo %verysome:~72,38% запишите start msiexec /x %verysome:~72,38% /q /norestart
1-й батник осуществляет поиск в реестре и передаёт найденные значения во второй, второй выполняет указаные комманды.
405
01 марта 2011 года
Dmitrii
554 / / 16.12.2004
Цитата: enothiz
попался вот такой скрипт <...> Если кто-нибудь прокомментирует, буду признателен.

Вот рабочий пример для Вашего случая:

Код:
Dim objWMI, arrSubKeys, objWShell
Dim strKey, strValue, strTemp

On Error Resume Next
Set objWMI = GetObject("winmgmts:\\.\root\default:StdRegProv")
If Err.Number = 0 Then
    strTemp = "Software\Microsoft\Windows\CurrentVersion\Uninstall"
    strKey = vbNullString
    objWMI.EnumKey &H80000002, strTemp, arrSubKeys
    If Err.Number = 0 Then
        For i = 0 To UBound(arrSubKeys)
            objWMI.GetStringValue &H80000002, strTemp & "\" & arrSubKeys(i), "DisplayName", strValue
            If Err.Number = 0 Then
                If StrComp(strValue, "Symantec Antivirus", vbTextCompare) = 0 Then
                    strKey = arrSubKeys(i)
                End If
            Else
                Err.Clear
            End If         
            If Len(strKey) > 0 Then
                Set objWShell = CreateObject("WScript.Shell")
                objWShell.Run "msiexec /x " & strKey & " /qn /norestart", 0
                Set objWShell = Nothing
                Exit For
            End If
        Next
    Else
        Err.Clear
    End If
Else
    Err.Clear
End If
Set objWMI = Nothing
WScript.Quit 0
278
01 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: arrjj
Вобщем 2 батника нужно использовать.
1-й батник
 
Код:
@echo off

for  /F "tokens=*" %%i in ('reg query hklm\software\microsoft\windows\currentversion\uninstall /s /f "Microsoft Visual C++ 2008 Redistributable" /t REG_SZ') do (

call qwe2.bat "%%i"

)



Это вы для какой версии винды написали? Просто в XP у reg query параметров /f и /t нет, специально проверил.

277
01 марта 2011 года
arrjj
1.7K / / 26.01.2011
проверял на 2k3 серваке, другой винды под рукой не было.
277
01 марта 2011 года
arrjj
1.7K / / 26.01.2011
о кстати только что нагуглил случайно:
 
Код:
@echo off
setlocal enabledelayedexpansion
 
for /F "tokens=1,3,4" %%G in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s') do (
 set value=%%G
 if "!value:~0,19!"=="HKEY_LOCAL_MACHINE\" set guid=!value:~-38!
 if "!value!"=="DisplayName" if /I "%%H %%I"=="Integrity Flex" echo !guid!
)
278
01 марта 2011 года
Alexander92
1.1K / / 04.08.2008
+1. Единственное, лучше было бы написать

 
Код:
for /f "tokens=1,3,4* ...
41K
02 марта 2011 года
enothiz
11 / / 17.10.2008
omg спасибо, полез в гугл
277
02 марта 2011 года
arrjj
1.7K / / 26.01.2011
enothiz,
Цитата: arrjj
о кстати только что нагуглил случайно:
 
Код:
@echo off
setlocal enabledelayedexpansion
 
for /F "tokens=1,3,4" %%G in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s') do (
 set value=%%G
 if "!value:~0,19!"=="HKEY_LOCAL_MACHINE\" set guid=!value:~-38!
 if "!value!"=="DisplayName" if /I "%%H %%I"=="Integrity Flex" echo !guid!
)



только вместо Integrity flex напиши symantec antivirus (с учетом регистра как правильно) и вместо echo !guid! напиши start msiexec /x !guid! /q /norestart

мы за тебя уже нагуглили))

41K
02 марта 2011 года
enothiz
11 / / 17.10.2008
спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог