【问题标题】:How can i execute sc create command through exec os/exec?如何通过 exec os/exec 执行 sc create 命令?
【发布时间】:2018-06-17 09:32:13
【问题描述】:

如何通过exec.Command 执行我的sc 命令?

代码:

cmd := exec.Command("cmd.exe", "sc", "create", "Simpler", "binpath="+os.Getenv("APPDATA")+"\\Simpler\\cc.exe", "displayname=MY SERVICE");
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true};
out, _ := cmd.Output(); fmt.Println(string(out))

这是我在命令提示符中得到的(在当前命令提示符中打开命令提示符-_-):

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>cd c:\prog\logs

c:\prog\logs>go build test.go

c:\prog\logs>test.exe
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

c:\prog\logs>

c:\prog\logs>

无法执行以下命令。我什么也得不到!问题出在哪里?

如果我在当前命令提示符下执行sc.exe,则命令已启动,但如果我在新命令提示符下执行则未启动。

也就是说,如果我删除第一个参数 "cmd.exe" 我的程序成功执行,但结果异常。但是如何在新窗口中执行呢?

【问题讨论】:

    标签: go service cmd exec sc


    【解决方案1】:

    嗯,最直接的问题是,您所做的不是应该如何告诉cmd.exe 执行外部命令——为了让它执行一个外部命令,您应该传递cmd.exe /C 或@987654324 @命令行选项, 就像在

    C:\>cmd.exe /C sc whatever sc_arg1 sc_arg2 ...
    

    您在通话中观察到的是 cmd.exe 忽略 您传递给它的其余参数并运行 - 那就是 正是你所观察到的。

    从研究cmd.exe /? 的输出和 内置 Windows 帮助系统,以便更好地了解其工作原理。

    下一个问题是,绝对没有理由让cmd.exe 参与运行sc——直接运行sc,而不是跳来跳去cmd.exe 让它执行sc

    下一个问题是您忽略了返回的错误值 致电os/exec.Cmd.Output。因为 Go(幸运的是)没有 有例外,处理所有错误值是最重要的 重要性——最好忽略其他所有内容,但不要 错误。 如果您正在编写高度实验性的代码,您可能 开始用一个愚蠢的助手像

    func check(err error) {
        if err != nil {
            panic(err)
        }
    }
    

    然后像滚动一样

    out, err := cmd.Output()
    check(err)
    

    这种方法不适用于生产级代码,但允许 在试验时加快代码搅动。

    您也可以考虑直接调用 Win32 API 以 管理服务,因为它将大量处理错误 更容易。

    【讨论】:

    • 请注意,您根本不需要cmd.exe
    【解决方案2】:

    有点晚了,不是真的关于运行 sc.exe。虽然@kostix 提供的答案解决了使用 SC.exe 的问题,但我看到您正在尝试创建 Go 应用程序的服务并认为这是一个 XY 问题。

    sc.exe 的单个调用不太可能成功创建 Windows 服务。但是,有一个库可以提供帮助:golang.org/x/sys/windows/svc

    github上也有例子:https://github.com/golang/sys/tree/master/windows/svc/example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2012-08-18
      • 2017-05-06
      相关资源
      最近更新 更多