Компьютерный форум 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=294469)

dosperados 26-01-2015 05:53 2461379

Поиск по значениям реестра
 
Добрый день, всем любителям powershell`a.
Встала задача поиска по значениям реестра.
Если более детально, то известен примерный путь где нужно искать и само значение параметра (т.к. имя параметра может быть разное и лежать в разных подразделах)
З.Ы. ищем в реестре надстройки Excel, т.к. версии excel разные и само имя надстройки (open, open1, open2, open3 и т.д.) может отличатся необходимо искать именно по значению реестра

Код:

$SKey = Get-ChildItem HKCU:\Software\Microsoft\Office -recurse -Include excel
данный запрос находит все разделы где находит Excel, а как правильно проводить поиск именно по значениям реестра!?
необходимо найти значение и изменить его.

IVa_ 26-01-2015 06:23 2461382

Цитата:

Цитата dosperados
Поиск именно по значениям реестр »

Скрытый текст
Получение всех подразделов раздела реестра

Скрытый текст
Показать все элементы, непосредственно содержащиеся в разделе реестра, можно при помощи командлета Get-ChildItem. Для отображения скрытых и системных элементов добавьте необязательный параметр Force. Например, эта команда отображает элементы, непосредственно расположенные на диске HKCU: Windows PowerShell, который соответствует кусту HKEY_CURRENT_USER:

PS> Get-ChildItem -Path hkcu:\


Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER

SKC VC Name Property
--- -- ---- --------
2 0 AppEvents {}
7 33 Console {ColorTable00, ColorTable01, ColorTab...
25 1 Control Panel {Opened}
0 5 Environment {APR_ICONV_PATH, INCLUDE, LIB, TEMP...}
1 7 Identities {Last Username, Last User ...
4 0 Keyboard Layout {}
...
Это разделы верхнего уровня, которые можно видеть под разделом HKEY_CURRENT_USER в редакторе реестра (Regedit.exe).

Указать этот путь в реестре можно также, задав имя поставщика реестра с последующей строкой ::. Полное имя поставщика реестра выглядит как Microsoft.PowerShell.Core\Registry, но может быть сокращено до Registry. Любая из следующих команд выведет содержимое элементов, непосредственно расположенных под разделом HKCU:

Get-ChildItem -Path Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Registry::HKCU
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKCU
Get-ChildItem HKCU:
Эти команды выводят только элементы, содержащиеся на диске непосредственно, так же как и команда DIR оболочки Cmd.exe и команда ls оболочки UNIX. Для показа вложенных элементов необходимо указать параметр Recurse. Для вывода всех подразделов раздела HKCU используется следующая команда (эта операция может занять очень продолжительное время):

Get-ChildItem -Path hkcu:\ -Recurse


Командлет Get-ChildItem позволяет выполнять сложные операции фильтрации при помощи параметров Path, Filter, Include и Exclude, но обычно с этими параметрами осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить при помощи командлета Where-Object. Следующая команда находит все подразделы раздела HKCU:\Software, у которых не более одного подраздела и ровно четыре значения:

Get-ChildItem -Path HKCU:\Software -Recurse | Where-Object -FilterScript {($_.SubKeyCount -le 1) -and ($_.ValueCount -eq 4) }

red.army@vk 26-01-2015 06:26 2461383

Приведите пример, какое значение на что поменять?

dosperados 26-01-2015 12:00 2461473

Конкретно на моем ПК это раздел HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
а в нем находятся параметры OPEN, OPEN1, OPEN2, OPEN3
в параметре OPEN3 находится значение, которое нужно поменять "c:\gal810\exe\XLS\F_XlsRep\GalRepBuilder.XLA" тип:REG_SZ
на "c:\новый_путь_до_XLA"

Цитата:

Цитата IVa_
Командлет Get-ChildItem позволяет выполнять сложные операции фильтрации при помощи параметров Path »

Спасибо за ответ, но как вы заметили я и пользовался этим командлетом, если бы понимал как поставить фильтр по конкретному значению, то не стал бы писать этот пост..

Foreigner 26-01-2015 12:27 2461489

dosperados,
Код:

set-itemproperty "hkcu:\Software\Microsoft\Office\14.0\Excel\Options" "OPEN3" "C:\PATH\TO"

dosperados 26-01-2015 12:33 2461491

Foreigner, прочитай первый пост, я писал что главное найти путь до параметра по значению параметра т.к. путь у всех разный...

Kazun 26-01-2015 13:33 2461524

Код:

Get-ChildItem "HKCU:\Software\Microsoft\Office\" -Recurse | ForEach-Object {
        $obj = Get-ItemProperty $_.pspath
        $prop = $obj | Get-Member -Type NoteProperty -ErrorAction SilentlyContinue | Foreach {$_.Name}
        $prop | Where {$obj.$_ -match "GalRepBuilder.XLA"} | Foreach {
                $obj | Set-ItemProperty  -Name $_ "C:\PATH"
        }
}


yurfed 26-01-2015 13:36 2461525

dosperados, вам готовый вариант RegReplace ни как не подходит?

dosperados 26-01-2015 13:50 2461537

Цитата:

Цитата yurfed
вам готовый вариант RegReplace ни как не подходит? »

использовать "левый" сторонний софт неизвестно кем и для чего написанный, вместо "мощнейшего" инструмента администрирования - powershell... нет, не подходит!!!

yurfed 26-01-2015 13:58 2461546

Цитата:

Цитата dosperados
использовать "левый" сторонний софт неизвестно кем и для чего написанный, вместо "мощнейшего" инструмента администрирования - powershell... нет, не подходит!!! »

А ещё кирпичи на голову с крыш падают. Поэтому лучше дома сидеть. Правда и люстра может упасть.
Цитата:

Цитата dosperados
"левый" сторонний »

У вас "левый" подход и видимо паранойя преследования. Укутайтесь матрасом и ляжьте под кровать. Компьютер выкиньте. Мало ли какие вирусы.

dosperados 26-01-2015 14:03 2461552

yurfed, Спасибо за помощь, но привычка пользоваться штатными средствами у меня с детства.
При том лучше один раз разобраться и решать подобные проблемы в дальнейшем маленькими скриптами, которые я могу централизовано запускать.

yurfed 26-01-2015 14:10 2461558

dosperados, Ваше право. Только хотелось подсказать готовый и удобный вариант. Лет 10 этой прожкой пользуюсь. Проблем небыло.
Ещё раз, право ваше.
ЗЫ Я не думаю что ассемблер тупее чем powershell. Если не ошибаюсь, написано именно на ассемблере + прикрученный GUI.

dosperados 27-01-2015 05:04 2461921

Цитата:

Цитата Kazun
Get-ChildItem "HKCU:\Software\Microsoft\Office\" -Recurse -Include excel | ForEach-Object { # я добавил ограничение -Include excel
$obj = Get-ItemProperty $_.pspath
$prop = $obj | Get-Member -Type NoteProperty -ErrorAction SilentlyContinue | Foreach {$_.Name} # здесь мне совсем не понятно зачем используется Get-Member с подавлением ошибок, ошибки возникают из-за того что не все структуры объекта имеют тип NoteProperty, поставил ограничение -name PSPath
$prop | Where {$obj.$_ -match "GalRepBuilder.XLA"} | Foreach {
$obj | Set-ItemProperty -Name $_ "C:\PATH"
}
} »

Не смог понять полностью суть вашего примера, у меня оригинальный вариант примера не работает, так и мои модификации не заставили его работать...

Оригинальный вариант примера выдает ошибку:

Set-ItemProperty : Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные
и их свойства не совпадают с любыми из параметров, принимающих входные данные конвейера.
строка:5 знак:10
+ $obj | Set-ItemProperty -Name $_ "C:\PATH"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (@{LastUILang=10....Core\Registry}:PSObject) [Set-ItemProperty], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.SetItemPropertyCommand

dosperados 27-01-2015 06:10 2461925

Нашел замечательную статью тык

готовый пример:
Код:

Get-ChildItem "HKCU:\Software\Microsoft\Office\" -rec -ea SilentlyContinue | foreach {
  $CurrentKey = (Get-ItemProperty -Path $_.PsPath)
  select-string "GalRepBuilder.XLA" -input $CurrentKey -AllMatches | foreach {($_.matches)|select-object Value}
}


dosperados 27-01-2015 07:09 2461934

Код:

Get-ChildItem "HKCU:\Software\Microsoft\Office\" -rec -ea SilentlyContinue | foreach {
  $CurrentKey = (Get-ItemProperty -Path $_.PsPath)
  if ($CurrentKey -match "GalRepBuilder.XLA") {
      $a = $CurrentKey
          $a.Description
          $a.PSPath
         
  }
}

Как выбрать конкретный параметр чтобы в нем изменить значение?

Foreigner 27-01-2015 07:41 2461938

dosperados,
Код:

[array] $keys = gci 'HKCU:\Software\Microsoft\Office' -recurse -include 'Excel'

foreach ($key in $keys) {

    $key.property | ? { (gp $key.pspath).$($_) -eq 'c:\gal810\exe\XLS\F_XlsRep\GalRepBuilder.XLA' } | % {
   
        sp $key.pspath $_ 'C:\New\Path\GalRepBuilder.XLA'
   
    }

}


dosperados 27-01-2015 12:13 2462041

Цитата:

Цитата Foreigner
[array] $keys = gci 'HKCU:\Software\Microsoft\Office' -recurse -include 'Excel'
foreach ($key in $keys) {
$key.property | ? { (gp $key.pspath).$($_) -eq 'c:\gal810\exe\XLS\F_XlsRep\GalRepBuilder.XLA' } | % {
sp $key.pspath $_ 'C:\New\Path\GalRepBuilder.XLA'
}
} »

Данный код не отрабатывает, по факту значения в реестре не меняются.

Foreigner 27-01-2015 14:54 2462177

dosperados, У меня нет офиса за ненадобностью, тестировал на 7-ZIP, все отрабатывало..

dosperados 28-01-2015 04:36 2462483

Foreigner, Пробовал запускать ваш пример без изменений, ни каких ошибок нет, но и результата нет. В реестре параметр не меняется.

dosperados 18-03-2015 10:06 2484203

если в PoSh использовать поиск reg query

Код:

REG.EXE QUERY "HKEY_CURRENT_USER\Software\Microsoft\Office" /s /d /f "c:\gal910\exe\XLS\F_XlsRep\GalRepBuilder.XLA"
результат запроса:
Цитата:

HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
OPEN3 REG_SZ "c:\gal910\exe\XLS\F_XlsRep\GalRepBuilder.XLA"

Поиск завершен: найдено совпадений: 1.
как с помощью PoSh парсить эту строку чтобы получить 2 переменные
1. путь до значения "HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options"
2. наименование значения "OPEN3"

Kazun 18-03-2015 10:30 2484209

$reg = REG.EXE QUERY .....
$reg[1] - HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Options
$reg[2] - OPEN3 REG_SZ "c:\gal910\exe\XLS\F_XlsRep\GalRepBuilder.XLA"

dosperados 18-03-2015 12:52 2484272

Kazun, Спасибо, но второй $reg[2] должен быть разбит на отдельные значения.
нашел решение сам: ($reg[2]).split(" ") -match "open"


Время: 06:36.

Время: 06:36.
© OSzone.net 2001-