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

问题描述 投票:0回答:3

我如何通过

sc
执行我的
exec.Command
命令?

代码:

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
3个回答
2
投票
好吧,眼前的问题是,您所做的并不是如何告诉

cmd.exe

 执行外部命令 - 为了使其执行外部命令,您应该传递 
cmd.exe
/C
 命令- 行选项,
就像在
/K

您在通话中观察到的是
C:\>cmd.exe /C sc whatever sc_arg1 sc_arg2 ...
忽略了 剩下的参数你传递给它并运行——那就是 正是您所观察到的。

首先研究 
cmd.exe

的输出和 内置 Windows 帮助系统可以更好地了解其工作原理。

下一个问题是,绝对没有理由让
cmd.exe /?

参与运行

cmd.exe

——直接运行
sc
而不是跳过
sc
来让它执行
cmd.exe
下一个问题是您忽略了返回的错误值
通过致电 
sc

。因为 Go(幸运的是)没有 有例外,处理所有错误值是最重要的 重要性——最好忽略其他一切,但不 错误。 如果您正在编写高度实验性的代码,您可能会

从像

这样的愚蠢助手开始
os/exec.Cmd.Output

然后像这样滚动

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

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

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

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

2
投票
单次调用

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

不太可能成功创建 Windows 服务。不过,有一个库可以提供帮助:

sc.exe

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


0
投票

golang.org/x/sys/windows/svc

输出:

func main() { data, _ := exec.Command("cmd.exe", "/C", "sc", "qc", "serviceName").Output() fmt.Println(string(data)) }


© www.soinside.com 2019 - 2024. All rights reserved.