Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   удаление разделов реестра по маске (?) (http://forum.oszone.net/showthread.php?t=226480)

foxbat 28-01-2012 18:51 1846368

удаление разделов реестра по маске (?)
 
Добрый час ! подсобите... нужно удалить кучу вот таких подобных разделов: все они начинаются одинаково ы digest , числа разные.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\RefHive\Microsoft\Windows\CurrentVersion\Internet Settings\Digest\Hosts\digest01EB0000n10004:digest01EB0000n10004]

Код:

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\RefHive\Microsoft\Windows\CurrentVersion\Internet Settings\Digest\Hosts\digest*")

в общем вопрос сводится как сделать выборку с условием.

DmitriiV 30-01-2012 09:20 1847400

Код:

Dim objReg, strKeyPath, arrSubKeys, intResult, strTemp, strLog
Const HKLM = &H80000002
strLog = "RegClearing_Result.log"
Set objReg = GetObject("winmgmts:\\.\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\RefHive\Microsoft\Windows\CurrentVersion\Internet Settings\Digest\Hosts"
On Error Resume Next
objReg.EnumKey HKLM, strKeyPath, arrSubKeys
If Err.Number = 0 Then
    If IsArray(arrSubKeys) Then
        For i = 0 To UBound(arrSubKeys)
            If InStrRev(arrSubKeys(i), "digest", -1, vbTextCompare) > 0 Then
                intResult = objReg.DeleteKey(HKLM, strKeyPath & "\" & arrSubKeys(i))
                If Err.Number = 0 Then
                    If intResult = 0 Then
                        strTemp = strTemp & arrSubKeys(i) & " -> удалён" & vbNewLine
                    Else
                        strTemp = strTemp & arrSubKeys(i) & " -> ошибка удаления с кодом " & intResult & vbNewLine
                    End If
                Else
                    strTemp = strTemp & arrSubKeys(i) & " -> ошибка " & Err.Number & vbNewLine
                    Err.Clear
                End If
            End If
        Next
        If Len(strTemp) > 0 Then
            Set objFS = CreateObject("Scripting.FileSystemObject")
            strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
            Set objFile = objFS.OpenTextFile(strLog, 2, True)
            objFile.Write strTemp
            objFile.Close
            Set objFile = Nothing
            Set objFS = Nothing
            WScript.Echo "Готово."
        Else
            WScript.Echo "Подключи с именами, соответствующими указанному условию, не обнаружены."
        End If
    Else
        WScript.Echo "Подключи не обнаружены."
    End If
Else
    WScript.Echo "Ошибка " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If
Set objReg = Nothing
WScript.Quit 0


foxbat 30-01-2012 12:48 1847511

Основательно. я думал уложиться в 5-10 строчек :). Спасибо, ДмитрийВ

foxbat 31-01-2012 18:26 1848630

Ошибка CScript: Ошибка при выполнении сервера сценариев Windows. (Параметр задан
неверно. )

DmitriiV 01-02-2012 07:31 1849012

1. Приведите полный текст сообщения об ошибке.
2. Если запускаемая Вами версия сценария отличается от приведённого примера, то выложите код Вашей версии.
3. Приведите полностью консольную команду, с помощью которой пытаетесь запустить сценарий.

foxbat 01-02-2012 08:59 1849032

1. это полный текст.
2. копировал вставил без изменений. два раза перепробовал
3. cscript //nologo scriptname.vbs

DmitriiV 01-02-2012 15:44 1849355

foxbat, пока не удаётся воспроизвести Вашу ситуацию.
1. Какая версия ОС используется?
2. Работает ли сценарий, если его запускать из GUI?
Если не работает, то каков будет результат работы сценария:
Код:

On Error Resume Next
Set objReg = GetObject("winmgmts:\\.\root\default:StdRegProv")
If Err.Number = 0 Then
    WScript.Echo "Подключение к провайдеру выполнено."
Else
    WScript.Echo "Ошибка " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If
WScript.Quit 0


foxbat 01-02-2012 18:11 1849467

Дмитрий, скрипт работает. я сохранил его в один файл, а запускал другой - пустой. Вот только результат прогона "Подключи не обнаружены."

DmitriiV 02-02-2012 11:49 1849937

Можно предположить, что указанный в сценарии путь для поиска отличается от реального.
Попробуйте выполнить (в консольном режиме) приведённый ниже сценарий и проанализируйте результат его выполнения.
Код:

Dim objReg, strKeyPath, arrSubKeys, strTemp, arrTemp, blnContinue
Dim objFS, objFile, strLog
Const HKLM = &H80000002
On Error Resume Next
Set objReg = GetObject("winmgmts:\\.\root\default:StdRegProv")
If Err.Number = 0 Then
    strLog = "RegPath_Parse.log"
    Set objFS = CreateObject("Scripting.FileSystemObject")
    strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
    Set objFile = objFS.CreateTextFile(strLog, True)
    strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\RefHive\Microsoft\Windows\CurrentVersion\Internet Settings\Digest\Hosts"
    arrTemp = Split(strKeyPath, "\")
    For i = 0 To UBound(arrTemp)
        strTemp = strTemp & arrTemp(i)
        arrSubKeys = Array()
        objReg.EnumKey HKLM, strTemp, arrSubKeys
        If Err.Number = 0 Then
            If UBound(arrSubKeys) >= 0 Then
                WScript.Echo strTemp & " -> кол-во подключей = " & UBound(arrSubKeys) + 1
                objFile.WriteLine strTemp & " -> кол-во подключей = " & UBound(arrSubKeys) + 1
                If i < UBound(arrTemp) Then
                    blnContinue = False
                    For j = 0 To UBound(arrSubKeys)
                        If StrComp(arrSubKeys(j), arrTemp(i + 1), vbTextCompare) = 0 Then
                            blnContinue = True
                            Exit For
                        End If
                    Next
                    strTemp = strTemp & "\"
                    If Not blnContinue Then
                        WScript.Echo strTemp & arrTemp(i + 1) & " -> подключ осутствует, продолжение просмотра невозможно"
                        objFile.WriteLine strTemp & arrTemp(i + 1) & " -> подключ осутствует, продолжение просмотра невозможно"
                        Exit For
                    End If
                Else
                    For j = 0 To UBound(arrSubKeys)
                        WScript.Echo arrSubKeys(j)
                        objFile.WriteLine arrSubKeys(j)
                    Next
                End If
            Else
                WScript.Echo strTemp & " -> подключи не обнаружены"
                objFile.WriteLine strTemp & " -> подключи не обнаружены"
                Exit For
            End If
        Else
            WScript.Echo strTemp & " -> ошибка чтения списка подключей"
            objFile.WriteLine strTemp & " -> ошибка чтения списка подключей"
            Err.Clear
            Exit For
        End If
    Next
    objFile.Close
    Set objFile = Nothing
    Set objFS = Nothing
Else
    WScript.Echo "Ошибка " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If
Set objReg = Nothing
WScript.Quit 0


foxbat 02-02-2012 14:11 1850032

вот последняя строка лога:
Код:

SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\RefHive\Microsoft\Windows\CurrentVersion\Internet Settings\Digest -> кол-во подключей = 1
хотя их там десятки тысяч. если надо могу скрин дать

по предыдущим разделам считает всё верно.

DmitriiV 03-02-2012 08:40 1850615

Цитата:

Цитата foxbat
... их там десятки тысяч...»

Возможно, именно такое большое количество подключей и является причиной неверной работы сценариев.
Попробуйте для пути
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\RefHive\Microsoft\Windows\CurrentVersion\Internet Settings\Digest"
выполнить запрос reg query, перенаправив его вывод в файл, а затем оцените достоверность выполнения запроса.


Время: 18:33.

Время: 18:33.
© OSzone.net 2001-