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

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

ADSL3MD 19-09-2011 21:46 1756422

CMD-скрипт для удаление пустых ключей реестра
 
Как сделать скрипт который будет удалять пустой ключ реестра, т.е. если в ключе (ветке) нет ничего.
Например, нужно удалить HKEY_LOCAL_MACHINE\SOFTWARE\DataStore (ключ DataStore) если в нём нет ни значений ни других ключей т.е. если он полностью пуст.
Существует ли возможность указать ключ для удаление в аргументах вызова скрипта?

Iska 20-09-2011 07:14 1756567

ADSL3MD, для начала — закрепите терминологию, чтобы не возникало неоднозначностей в понимании. С большой долей уверенности предположу, что речь идёт всё-таки о разделе.

Можно попробовать и на CMD, но там будет некоторая зависимость от версии reg.exe. Например, для версии 3.0:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSubKey=%~1

if not defined sSubKey (
        echo Usage: %~nx0 ^<Registry SubKey^>
        exit /b 255
)

reg.exe query "%sSubKey%" 1>nul 2>&1 || (
        echo Registry Subkey [%sSubKey%] not found
        exit /b 1
)

for /f %%i in (
    'reg.exe query "%sSubKey%" /s ^| find.exe /i /v "" /c'
) do set /a sLines = %%i

if defined sLines if %sLines% equ 4 reg.exe delete "%sSubKey%" /f 1>nul

endlocal
exit /b 0

В WSH («WScript.Shell»/WMI) с этим совсем плохо (всё упирается в ошибки реализации при работе с Default-значением). Проще всего на PowerShell, наподобие:
Код:

Param
(
    [parameter(
        Mandatory = $True,
        Position  = 0
    )]
    [String]
    $SubKey
)

$sSubKey = "Registry::" + $SubKey

if (Test-Path -Path $sSubKey) {
    $oPath = Get-Item -Path $sSubKey

    if (($oPath.SubKeyCount -eq 0) -and ($oPath.ValueCount -eq 0)) {
        try {
            Remove-Item -Path $oPath.PSPath
        } catch { }
    }
} else {
    Write-Host "Not found registry subkey [$SubKey]"
}


SendMessage 20-09-2011 14:22 1756746

Вариант:
Код:

@echo off

set "Key=%~1"

for /f "delims=" %%a in ('reg query "%Key%" /s') do set "Val=%%a"

if /i "%Val%"=="%Key%" (
  reg delete "%Key%" /f
  echo Раздел %Key% удален.
) else (
  echo Раздел %Key% не пуст.
)

Имя исследуемого раздела нужно писать без сокращения имени ветки: не HKLM, а HKEY_LOCAL_MACHINE. Ну и другие ветки, естественно, так же.
Пример запуска из комстроки:
Код:

DelEmptyKey.bat "HKEY_LOCAL_MACHINE\SOFTWARE\DataStore"

Iska 20-09-2011 17:48 1756861

Да, это проще и работает. Единственно — если раздел отсутствует, то сообщение «Раздел … не пуст.» будет нелогичным.

ADSL3MD 20-09-2011 19:16 1756938

Большое спасибо за помощь.


Время: 07:45.

Время: 07:45.
© OSzone.net 2001-