2017-06-05 170 views
0

有沒有辦法檢測主機操作系統是XP,Vista,7,8還是10? runtime.GOOS只是返回「窗口」。在Go中檢測windows版本

原因是因爲我試圖操縱啓動文件夾中的文件。

在Windows Vista,7,8,10它位於:

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

在Windows XP上它位於:

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

+0

我敢肯定,有一些Windows API用於查找啓動文件夾,這將比嘗試自己找到它更好。 –

+0

正確的方法是使用帶有['KNOWNFOLDERID''](https:// msdn)的['SHGetKnownFolderPath'函數](https://msdn.microsoft.com/library/windows/desktop/bb762188.aspx) microsoft.com/library/windows/desktop/dd378457.aspx)['FOLDERID_CommonStartup'](https://msdn.microsoft.com/library/windows/desktop/dd378457.aspx#FOLDERID_CommonStartup)或['FOLDERID_Startup'] (https://msdn.microsoft.com/library/windows/desktop/dd378457.aspx#FOLDERID_Startup)取決於你對哪個Startup文件夾感興趣。 –

+0

我看了看'SHGetKnownFolderPath',它說「支持的最小客戶端: Windows Vista「,這是否意味着這個功能將無法在XP上運行? – JackMordaunt

回答

2

爲什麼不使用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

0

如果您想獲取Windows版本,請使用純粹的Go Win32 API包裝w32 library。它有w32.GetVersion()和this Windows version table你知道你在哪裏。

package main 

import (
    "fmt" 
    "github.com/gonutz/w32" 
) 

func main() { 
    v := w32.GetVersion() 
    major, minor := v&0xFF, v&0xFF00>>8 
    fmt.Printf("%d.%d", major, minor) 
} 

不過請注意,正如其他人正確地指出,你真的應該使用合適的Win32 API函數來獲得你的情況特殊文件夾。