首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以捕获外部命令设置的环境变量?

问是否可以捕获外部命令设置的环境变量?
EN

Stack Overflow用户
提问于 2018-02-27 03:48:39
回答 1查看 296关注 0票数 0

我有一个脚本(在Windows上),它设置了许多环境变量。我想在Go中执行这个脚本,为后续的二进制调用设置环境变量。

就像这样:

代码语言:javascript
复制
cmd1 := exec.Command("setup_env.bat")
cmd.Run()

// other_command.exe relies on environment variables
// set by setup_env.bat
cmd2 := exec.Command("some_binary.exe")
cmd2.Env = cmd1.Env
cmd2.Run()

但是这不起作用,因为cmd1.Env在调用cmd1.Run()之后是空的( cmd1中设置的环境变量似乎不会传播到cmd1.Env)。在调用os.Environ()之后,cmd1.Run()似乎也没有受到影响。

如果您对我为什么要这样做感到好奇,我将尝试自动执行通常要求用户在命令提示符下调用setup_env.bat,然后调用other_command.exe的任务。我不拥有setup_env.bat,而且它可能经常变化,所以我不能自己设置环境变量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 01:49:50

我设法用以下代码生成了所需的结果:

代码语言:javascript
复制
cmd := exec.Command("setup_env.bat", "&&", "some_binary.exe")
cmd.Run()

我还发现,在用stdout打印环境之后,可以通过捕获SET来手动解析环境变量。例如:

代码语言:javascript
复制
func getEnv(command string) ([]string, error) {
    cmd := exec.Command(command, "&&", "SET")
    out, _ := cmd.StdoutPipe()

    err := cmd.Start()
    if err != nil {
        return nil, err
    }

    rawEnv, _ := ioutil.ReadAll(out)

    err = cmd.Wait()
    if err != nil {
        return nil, err
    }

    env := strings.Split(string(rawEnv), "\r\n")
    return env[:len(env)-1], nil
}

// ...

cmd := exec.Command("some_binary.exe")
env, err := getEnv("setup_env.bat")
if err != nil {
    log.Fatal(err)
}
cmd.Env = env // or os.Setenv(...) if you need it in current context
cmd.Run()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49000797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档