我如何通过
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"
我的程序成功执行,但结果异常。但如何在新窗口中执行呢?
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 问题。
golang.org/x/sys/windows/svc
输出:
func main() {
data, _ := exec.Command("cmd.exe", "/C", "sc", "qc", "serviceName").Output()
fmt.Println(string(data))
}