Home > Enterprise >  Test-Path Registry key works in Windows Terminal but not in my .ps1 script
Test-Path Registry key works in Windows Terminal but not in my .ps1 script

Time:12-07

I am wanting to to test if a registry key exists by using Test-Path:

if((Test-Path -Path 'HKLM:\SOFTWARE\IDTSettings') -eq $true) {
    echo "Registry Key Exists, Ignoring this machine."
    exit
}
else {
...

I manually created this key in the registry and it looks like this: Screenshot of regedit for the key that I manually created.

However, running this script will never exit and instead it will go into the else statement.

To test this I tried Test-Path -Path 'HKLM:\SOFTWARE\IDTSettings' in the Windows Terminal and it responded with the appropriate True.

I am confused why these are different and would love if anyone would be able to help with this.

Many thanks

EDIT:

Weirdly if I run the powershell script from Windows Terminal it will detect the registry key fine but If I try to run it from PowerShell ISE it doesn't work. This does fix my problem as the script works properly when I call it so I will close this question. Thank you all for trying to help :)

CodePudding user response:

You use Test-Path cmdlet to see if a key exists. Test-Path can detect registry keys (the containers), but it cannot detect registry entries (sometimes called “values”) or the data in an entry. If you try, it always returns FALSE.

You use Get-ItemProperty cmdlet to see the key value

$path = "HKLM:\SOFTWARE\Intel\Display\igfxcui\3D"
$value = "Global"

#You can use the Test-Path cmdlet to check for the key, but not for specific values within a key
Test-Path $path

#You can use the Get-ItemProperty to see the value
Get-ItemProperty -Path $Path | Select-Object -ExpandProperty $Value

Test Registry Path

CodePudding user response:

Weirdly if I run the powershell script from Windows Terminal it will detect the registry key fine but If I try to run it from PowerShell ISE it doesn't work. This does fix my problem as the script works properly when I call it so I will close this question. Thank you all for trying to help :)

CodePudding user response:

As you have confirmed, the problem was that you ran your script from the 32-bit version of the ISE, which sees different, 32-bit-application-specific registry information in the HKEY_LOCAL_MACHINE\SOFTWARE subtree (which, expressed as a PowerShell path, is equivalent to HKLM:\SOFTWARE).

  • If use of the 32-bit ISE was accidental (check if the window title ends in (x86)), simply run the 64-bit version instead (e.g., run powershell_ise from a 64-bit PowerShell or cmd.exe session, which launches C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell_ise.exe)

  • Otherwise, see below.


If you really must test the existence of a key in the 64-bit HKEY_LOCAL_MACHINE\SOFTWARE subtree from a 32-bit process, more work is needed; one option is to use reg.exe:

if ($(reg.exe query 'HKEY_LOCAL_MACHINE\SOFTWARE\IDTSettings' /reg:64 *>$null; -not $LASTEXITCODE)) {
  "Registry key exists, ignoring this machine."
  exit
}
else {
  
  # ...
}

Note that the inverse solution - accessing a 32-bit key from a 64-bit process would be simpler: the 32-bit data is accessible via the HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node subtree
(if (Test-Path 'HKLM:\SOFTWARE\Wow6432Node\IDTSettings') { ... })

  • Related