在 Go 中检测 Windows 版本

Jac*_*unt 1 windows command-line-interface go

有没有办法检测主机操作系统是 XP、Vista、7、8 还是 10? runtime.GOOS只返回“windows”。

这样做的原因是因为我试图操作启动文件夹中的文件。

在 Windows Vista、7、8、10 上,它位于:

%appdata%\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

在 Windows XP 上,它位于:

Documents and Settings\%username%\Start Menu\Programs\Startup

Ada*_*mar 5

为什么不使用 Windows 注册表?

https://godoc.org/golang.org/x/sys/windows/registry

如何使用 golang 从 windows/registry 返回默认值

package main

import (
    "golang.org/x/sys/windows/registry"
    "log"
    "fmt"
)

func main() {

    k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
    if err != nil {
        log.Fatal(err)
    }
    defer k.Close()

    cv, _, err := k.GetStringValue("CurrentVersion")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentVersion: %s\n", cv)

    pn , _, err := k.GetStringValue("ProductName")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("ProductName: %s\n", pn)

    maj, _, err := k.GetIntegerValue("CurrentMajorVersionNumber")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentMajorVersionNumber: %d\n", maj)

    min, _, err := k.GetIntegerValue("CurrentMinorVersionNumber")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentMinorVersionNumber: %d\n", min)

    cb, _, err := k.GetStringValue("CurrentBuild")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentVersion: %s\n", cb)    
}
Run Code Online (Sandbox Code Playgroud)

这将返回:

PS C:\Users\Adamar\Desktop> .\WindowsVersion.exe
CurrentVersion: 6.3
ProductName: Windows Server 2016 Standard Evaluation
CurrentMajorVersionNumber: 10
CurrentMinorVersionNumber: 0
CurrentVersion: 14393
Run Code Online (Sandbox Code Playgroud)

尽管在最新版本的 Windows 中,您必须阅读以下键才能获取版本:CurrentMajorVersionNumber & CurrentMinorVersionNumber