April 2nd, 2015

Update or Add Registry Key Value with PowerShell

Doctor Scripto
Scripter

Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to update or add a registry key value.

Hey, Scripting Guy! Question Hey, Scripting Guy! I am having a problem trying to update the registry. I am using the New-ItemProperty cmdlet, but it fails if the registry key does not exist. I added the –Force parameter, but it still will not create the registry key. The error message says that it cannot find the path because it does not exist. Is there something I am not doing? I am including my script so you can see what is going on. Help me please.

—DC

Hey, Scripting Guy! Answer Hello DC,

Microsoft Scripting Guy, Ed Wilson, is here. In your script, you are using the New-ItemProperty cmdlet to attempt to update a registry key property value. When the registry key property exists, your script works. But when it does not, it fails. Here is a version of your script:

$registryPath = "HKCU:\Software\ScriptingGuys\Scripts"

$Name = "Version"

$value = "1"

New-ItemProperty -Path $registryPath -Name $name -Value $value `

    -PropertyType DWORD -Force | Out-Null

And here is the error message that appears when the registry key does not exist:

Image of error message

You need to test for the existence of the registry key. If the registry key does not exist, then you need to create the registry key, and then create the registry key property value. The first thing I like to do is to create the path to the registry key, then specify the property name and the value I want to assign. This consists of three variables as shown here:

$registryPath = "HKCU:\Software\ScriptingGuys\Scripts"

$Name = "Version"

$value = "1"

Now I can use the Test-Path cmdlet to see if the registry key exists. To do this, I use the If statement, and I look for the registry key that is NOT existing. I use the explanation point ( ! ) as the not operator. I need to put the Test-Path statement in a pair of parentheses so that I am "NOTing" the condition. This is shown here:

IF(!(Test-Path $registryPath))

You may wonder why I cannot use Test-Path to verify that the registry key property does not exist. After all, that is what the script is all about in the first place. The reason, is that Test-Path does not know how to work with registry key property values. It will attempt to work, but it does not.

Here is an example of doing that:

PS C:\> Test-Path HKCU:\Software\ScriptingGuys\scripts

True

PS C:\> Test-Path HKCU:\Software\ScriptingGuys\scripts\version

False

PS C:\> (Get-ItemProperty -Path HKCU:\Software\ScriptingGuys\Scripts -Name version).version

1

PS C:\> Test-Path HKCU:\Software\ScriptingGuys\scripts\version -PathType Leaf

False

PS C:\> Test-Path HKCU:\Software\ScriptingGuys\scripts\version -PathType Any

False

After I verify that the registry key exists, I use the New-ItemProperty cmdlet to create or update my registry key property value:

New-Item -Path $registryPath -Force | Out-Null

    New-ItemProperty -Path $registryPath -Name $name -Value $value `

    -PropertyType DWORD -Force | Out-Null

If the registry key already exists, there is no need to attempt to create it again, so I create the registry key property value. As shown here, this code appears in the ELSE condition of the statement:

ELSE {

    New-ItemProperty -Path $registryPath -Name $name -Value $value `

    -PropertyType DWORD -Force | Out-Null}

Here is the complete script:

$registryPath = "HKCU:\Software\ScriptingGuys\Scripts"

$Name = "Version"

$value = "1"

IF(!(Test-Path $registryPath))

  {

    New-Item -Path $registryPath -Force | Out-Null

    New-ItemProperty -Path $registryPath -Name $name -Value $value `

    -PropertyType DWORD -Force | Out-Null}

 ELSE {

    New-ItemProperty -Path $registryPath -Name $name -Value $value `

    -PropertyType DWORD -Force | Out-Null}

I can use the Registry Editor to verify that my registry key property value exists with the proper value:

Image of menu

Or, I can use the Get-ItemProperty cmdlet. Such a command is shown here:

PS C:\> (Get-ItemProperty -Path HKCU:\Software\ScriptingGuys\Scripts -Name version).version

1

I could use Get-ItemProperty to verify if a registry key property value exists. If the registry key property does not exist, the error message is very specific. It is shown here:

PS C:\> (Get-ItemProperty -Path HKCU:\Software\ScriptingGuys\Scripts -Name version).version

Get-ItemProperty : Property version does not exist at path HKEY_CURRENT_USER\Software\ScriptingGuys\Scripts.

At line:1 char:2

+ (Get-ItemProperty -Path HKCU:\Software\ScriptingGuys\Scripts -Name version).vers …

+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidArgument: (version:String) [Get-ItemProperty], PSArgumentException

    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException,Microsoft.PowerShell.Commands.GetItemPropertyCommand

If the registry key itself does not exist, I get a different error message. This is shown here:

PS C:\> (Get-ItemProperty -Path HKCU:\Software\ScriptingGuys\Scripts -Name version).version

Get-ItemProperty : Cannot find path 'HKCU:\Software\ScriptingGuys\Scripts' because it does not exist.

At line:1 char:2

+ (Get-ItemProperty -Path HKCU:\Software\ScriptingGuys\Scripts -Name version).vers …

+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : ObjectNotFound: (HKCU:\Software\ScriptingGuys\Scripts:String) [Get-ItemProperty],

    ItemNotFoundException

    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemPropertyCommand

The first error message complains about the PROPERTY, the second error complains about the PATH. So, two different error messages are returned depending on the issue. Therefore, I could implement structured error handling, detect the specific error, and then correct it as appropriate.

But that would be more complicated than I want to do for making simple registry changes. If you have such a need, you may want to check out this collection of Hey, Scripting Guy! Blog posts, where I talk about structured error handling in Windows PowerShell scripts.

DC, that is all that is needed to fix your registry script. Troubleshooting Week will continue tomorrow when I will talk about more cool stuff. 

I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.

Ed Wilson, Microsoft Scripting Guy 

Author

The "Scripting Guys" is a historical title passed from scripter to scripter. The current revision has morphed into our good friend Doctor Scripto who has been with us since the very beginning.

2 comments

Discussion is closed. Login to edit/delete existing comments.

  • Michaël Van den Steen

    Hello,

    Thanks a lot for this article!

    I wanted to write a script to change a Registry value in Powershell (deployed via Intune).

    The first script I used was:
    $Regkey= "HKCU:\Software\Microsoft\Windows\CurrentVersion\PenWorkspace\"
    # This function just gets $true or $false
    function Test-RegistryValue($path, $name)
    {
    $key = Get-Item -LiteralPath $path -ErrorAction SilentlyContinue
    $key -and $null -ne $key.GetValue($name, $null)
    }

    # Gets the specified registry value or $null if it is missing
    function Get-RegistryValue($path, $name)
    {
    $key = Get-Item -LiteralPath $path -ErrorAction...

    Read more
  • Abdul Rauf

    Hi Scripting Guy!
    I am very new in scripting, learning and knows next to nothing. I assume you can help me to write a powershell script. Reg Add cmd.
    I would like to add/edit the mount point for the newly added shared drive with a string value named "_LabelFromDesktopINI" with no text​, the Value Data to match what I want to display in the file explorer.
    To change the display name of the file share...

    Read more