JanDeDobbeleer/oh-my-posh · error

Error, malformed registry path

Error message

Error, malformed registry path: '%s'

What it means

WindowsRegistryKeyValue parses an input string of the form "ROOT\Path\Key" (or "ROOT\Path\" for the Default value). strings.Cut on the first backslash must produce both a root key and a remainder; if the input contains no backslash at all, the path is malformed and the function returns this error instead of querying the registry.

Solutions

  1. Include the full path with backslashes, e.g. "HKLM\Software\Microsoft\Windows NT\CurrentVersion\EditionID".
  2. Check the config value that feeds the registry property - ensure any template variables expand to a full path.
  3. Verify you use backslash (\) as the separator, not forward slash.
  4. If you want the Default value of a key, end the path with a trailing backslash (e.g. "HKLM\Software\X\").

Example fix

// before (template/config)
registry = "HKLM"

// after
registry = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\EditionID"
Defensive patterns

Strategy: validation

Validate before calling

func validRegistryPath(p string) bool {
    return strings.Contains(p, "\\") && strings.Index(p, "\\") > 0
}
// call only if validRegistryPath(path)

Type guard

func looksLikeRegistryPath(s string) bool {
    i := strings.Index(s, "\\")
    return i > 0
}

Try / catch

val, err := term.WindowsRegistryKeyValue(input)
if err != nil && strings.Contains(err.Error(), "malformed registry path") {
    // fall back to a default value or hide the segment
    return defaultRegistryValue
}

Prevention

When it happens

Trigger: Calling WindowsRegistryKeyValue (e.g. via a registry template property in a config) with a string lacking a backslash - like "HKLM" alone, an environment variable that resolved to a bare key name, or using forward slashes instead of backslashes.

Common situations: Config typos in a custom prompt's registry lookup; a template variable that expands to an empty or partial path; copying a registry path that uses "/" separators.

Understand the failure class

Related errors


AI-assisted analysis of JanDeDobbeleer/oh-my-posh@0976794618 (2026-08-31). Data as JSON: /api/errors/84d01ae6bc601c6d. Report an issue: GitHub.

Appendix: source

Thrown at src/runtime/terminal_windows.go:141

// If the path ends in "\", the "(Default)" key in that path is retrieved.
func (term *Terminal) WindowsRegistryKeyValue(input string) (*WindowsRegistryValue, error) {
	defer log.Trace(time.Now(), input)

	// Format:
	// "HKLM\Software\Microsoft\Windows NT\CurrentVersion\EditionID"
	//   1  |                  2                         |   3
	//
	// Split into:
	//
	// 1. Root key - extract the root HKEY string and turn this into a handle to get started
	// 2. Path - open this path
	// 3. Key - get this key value
	//
	// If 3 is "" (i.e. the path ends with "\"), then get (Default) key.
	//
	rootKey, regPath, found := strings.Cut(input, `\`)
	if !found {
		err := fmt.Errorf("Error, malformed registry path: '%s'", input)
		log.Error(err)
		return nil, err
	}

	var regKey string
	if !strings.HasSuffix(regPath, `\`) {
		regKey = path.Base(regPath)
		if len(regKey) != 0 {
			regPath = strings.TrimSuffix(regPath, `\`+regKey)
		}
	}

	var key registry.Key
	switch rootKey {
	case "HKCR", "HKEY_CLASSES_ROOT":
		key = windows.HKEY_CLASSES_ROOT
	case "HKCC", "HKEY_CURRENT_CONFIG":
		key = windows.HKEY_CURRENT_CONFIG

View on GitHub (pinned to 0976794618)