Ваша проблема в том, что для 32-битного процесса , следующие ключевые пути относятся к тому же местоположению, а именно к представлению реестра для 32-битных приложений:
# To both 64- and 32-bit processes: The registry view for 32-bit applications.
HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
# To 32-bit processes: same as above
# To 64-bit processes: the 64-bit view of the registry.
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
Другими словами: ваш код при запуске в 32-битном процессе выполняет одно и то же дважды .
Использование только реестра путь ключа не позволит 32-разрядному процессу видеть 64-разрядный реестр.
Однако есть обходные пути :
Вызов 64-разрядного экземпляра PowerShell как внешнего процесса через каталог $env:WinDir\SysNative
- см. Ниже.
Использование .NETвведите напрямую, как показано в этом ответе .
Вызов 64-битного PowerShell из (32-битного) PowerShell с блоком скриптов { ... }
автоматически сериализует выходные объекты 64-битного экземпляра в формате CLIXML, что позволяет вызывающему экземпляру автоматически десериализовать их с разумной точностью [1] , чтобы ваши оригинальные команды фильтрации работали:
# Works only in a 32-bit process.
& $env:WINDIR\SysNative\WindowsPowerShell\v1.0\powershell.exe {
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
} |
Where-Object {$_.DisplayName -like $appName} |
Select-Object @{Expression={$_.DisplayName + "|" + $_.DisplayVersion +"|x64"}} |
Sort-Object -Unique
Чтобы определить, выполняется ли ваш сценарий в 32-битном процессе, используйте:
$is32Bit = ${env:ProgramFiles(x86)} -eq ${env:ProgramFiles} -or
-not ${env:ProgramFiles(x86)}
-or -not ${env:ProgramFiles(x86)}
part обнаруживает случай запуска на чистой 32-битной версии Windows, но обратите внимание, что, очевидно, там нет 64-битных определений.
[1] За исключением нескольких скважинДля известных типов входные объекты десериализуются как [PSCustomObject]
экземпляры со статическими свойствами, отражающими значения свойств исходного объекта.