Get-ChildItem фильтруется и сортируется - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь выбрать все ключи деинсталляции в реестре, которые имеют свойство DisplayName, отсортированные по Displayname. Я бы подумал, что это сработает.

$uninstall32 = 'HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
$uninstall64 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
$uninstallKeys = (Get-ChildItem "Registry::$uninstall32" | Where-Object {$_.DisplayName} | sort DisplayName) +
                 (Get-ChildItem "Registry::$uninstall64" | Where-Object {$_.DisplayName} | sort DisplayName)

foreach ($uninstallKey in $uninstallKeys) {
    $uninstallKey
}

Но это ничего не возвращает. Если я удаляю Where-Object, я получаю результаты, но не сортирую. Куда я иду не так?

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Вы можете просто направить свои команды Get-ChildItem в | Get-ItemProperty для получения желаемого результата.

При этом я столкнулся с проблемой, когда у меня был неверный ключ в моем реестре. Чтобы обойти эту возможную проблему, я перебрал каждый элемент и получил свойство отдельно.

$uninstall32 = 'HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
$uninstall64 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
$uninstallKeys = (Get-ChildItem "Registry::$uninstall32") +
(Get-ChildItem "Registry::$uninstall64")

$AllKeys = `
  Foreach ($key in $uninstallKeys) {
  try {
    $Value = $Key | Get-ItemProperty -ErrorAction Stop
    $Value
  }
  catch {
    Write-Warning $_
  }
}
$AllKeys  = $AllKeys  | WHere DisplayName -ne '' | sort displayname

Ссылка

Относительно возможного Указанное приведение не является допустимой ошибкой с Get-ItemProperty и удалением местоположения реестра

0 голосов
/ 12 февраля 2020

Вывод get-childitem является своего рода иллюзией. На самом деле он вызывает get-itemproperty в файле формата. Вам нужно использовать get-itemproperty, чтобы увидеть значения и данные. Вы можете вместо этого использовать команду get-package. Обратите внимание, что Netbeans делает недопустимую запись dword реестра «NoModify» при установке, что создает исключение в get-itemproperty.

Вот подход с get-itemproperty:

get-itemproperty hklm:\software\microsoft\windows\currentversion\uninstall\* | 
  where displayname | sort displayname
0 голосов
/ 12 февраля 2020

Если я правильно понял вопрос, вы хотите, чтобы ключ PATHS возвращался как строковый массив, ИЛИ ключи как объекты, включая все свойства:

$uninstall = 'HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*',
             'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\*'

$uninstallKeys = $uninstall | ForEach-Object {
    Get-ItemProperty "Registry::$_" | 
    Where-Object {$_.DisplayName} | 
    Sort-Object DisplayName | 
    # if you want the Keys Paths returned as string properties:
    Select-Object @{Name = 'RegistryKey'; Expression = {($_.PSPath -split '::')[1]}}

    # if you want the Keys returned with all properties as objects:
    # Select-Object $_.PSPath
}

$uninstallKeys
...