как получить название раздела реестра и передать в переменную?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall.
Раздел, содержащий ключ DisplayName со значением Symantec Antivirus и является продакт-кодом симантека. к сожалению, у разных версий (сборок) этот самый продакт-код отличается, так что использовать один на всех не получится. Лазать руками на всех машинах неэргономично.
Вопрос: можно ли из батника (из командной строки) найти ключ по значению, определить название раздела содержащего этот ключ и передать это название в команду (при помощи переменной или ещё как).
местные кодеры от vb кривятся и предлагают собрать екзешник в перле, когда нибудь
неприятность в том, что Product Code - это не значение параметра, а раздел, в котором всё содержится. Я не кодер, мне неочевидно, как так извернуться, чтобы это самое получить и сунуть в, например, start msiexec /x %1 /q /norestart
Тогда, возможно, я не совсем хорошо вас понял, что вам нужно. Что вам нужно найти - раздел по ключу, по значению или что-то еще?
какой-то фиговый аргумент.Тем более,когда-то может наступить тогда,когда вам это будет не надо
Либо пишите на к.-л. ЯП(если владеете,конечно).Ибо .bat слабоват для этого
Раз уж на то пошло, то WSH - это не только VBS, но и JS.
То есть нужное значение - это имя некоего подключа в ключе UNINSTALL ?
Сеть - доменная?
Версии ОС на станциях?
Сеть - доменная?
Версии ОС на станциях?
PDC на Gentoo, есть ещё OCS inventory, с помощью которого и предполагалось скормить воркстейшенам батник/скрипт. WinXP SP2-SP3, в основном последнее.
название подраздела (или ключа, я уже путаюсь в терминологии реестра, визуально в редакторе это выглядит как подраздел с параметрами внутри) по значению ключа,ключ DisplayName значение Symantec Antivirus
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 другая). Если кто-нибудь прокомментирует, буду признателен.
1-й батник
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 из предыдущего батника)
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-й батник осуществляет поиск в реестре и передаёт найденные значения во второй, второй выполняет указаные комманды.
Вот рабочий пример для Вашего случая:
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
1-й батник
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 нет, специально проверил.
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!
)
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
мы за тебя уже нагуглили))