windows - 在 Go 中检测 windows 版本以找出启动文件夹

标签 windows go winapi

有没有办法检测主机操作系统是 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

最佳答案

为什么不使用 windows 注册表?

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

How to return a default value from windows/registry with golang

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)    
}

返回:

PS C:\Users\Adamar\Desktop> .\WindowsVersion.exe
CurrentVersion: 6.3
ProductName: Windows Server 2016 Standard Evaluation
CurrentMajorVersionNumber: 10
CurrentMinorVersionNumber: 0
CurrentVersion: 14393

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

关于windows - 在 Go 中检测 windows 版本以找出启动文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363911/

相关文章:

windows - 我如何知道是否使用 RawInput 按下了 shift?

c++ - 如何从 C++ 中的 PWSTR 中提取子字符串

go - 获取类似 python 的 split() 与 go 的 strings.Split() 一起工作

go - 如何访问接口(interface)中未定义的类型方法?

c - 使用第二个参数的 ReadConsoleOutputCharacter 错误

c++ - 将参数传递给 Windows 中的窗口调用

windows - 在 Windows 上将 CTRL+C 发送到子进程树

windows - 为什么以管理员身份运行时我的应用程序工作方式不同?

regex - 如何查看字符串是否为四个字母长? – Windows 批处理

go - 测试使用var声明来模拟结果的函数