go - 如何通过 exec os/exec 执行 sc create 命令?

标签 go service cmd exec

如何通过 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",我的程序会成功执行并出现异常结果。但是如何在新窗口执行呢?

最佳答案

那么,眼前的问题是您所做的不是告诉 cmd.exe 执行外部命令的方式——为了让它执行一个命令,您应该通过 cmd .exe /C/K 命令行选项, 喜欢在

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(幸运的是)没有 有异常(exception),处理所有错误值是最重要的 重要性——最好忽略其他一切,但不要 错误。 如果您正在编写高度实验性的代码,您可能 开始像一个愚蠢的助手

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

然后像这样滚动

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

此方法不适用于生产级代码,但允许 以便在试验时更快地修改代码。

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

关于go - 如何通过 exec os/exec 执行 sc create 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895380/

相关文章:

windows - 在输入每个命令之前自动运行 Windows 命令

c# - 超时执行shell c#

java - ProcessBuilder 和 cmd

go - 如何更新结构的数据并将其保存在链代码中?

go - Reflect函数消除了开关和if语句在函数中的混合

go - 如何在golang中实现不同包的接口(interface)?

go - 简单消息客户端 golang

docker - 为什么 "service cron start"在 Docker 文件中不起作用?

android - 在 Android 上的应用程序之间通信的首选方式是什么(服务与 Intent )

Android:stopService 不调用 onDestroy