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

时间:2018-06-17 09:32:13

标签: go service cmd exec sc

如何通过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",我的程序会成功执行,并使用例外结果。但是如何在新窗口中执行?

2 个答案:

答案 0 :(得分:2)

嗯,直接的问题是你做的不是cmd.exe应该如何告诉你执行一个外部命令 - 为了让它执行一个,你应该cmd.exe /C /K 1}}或C:\>cmd.exe /C sc whatever sc_arg1 sc_arg2 ... 命令行选项, 喜欢在

cmd.exe

您通过电话观察到的是cmd.exe /?忽略了 你传递给它的其余论点只是运行 - 那就是 正是你所观察到的。

首先研究cmd.exesc的输出 内置的Windows帮助系统,可以更好地了解它的工作原理。

下一个问题是,绝对没有理由让sc参与运行cmd.exe - 直接运行sc而不是跳转os/exec.Cmd.Output以使其执行func check(err error) { if err != nil { panic(err) } }

下一个问题是您忽略了返回的错误值 致电out, err := cmd.Output() check(err) 。由于Go(幸运的是)没有 有例外,处理所有错误值是至关重要的 重要性 - 忽略其他所有事情更好 错误。 如果您正在撰写高度实验性的代码,那么您可以 使用像

这样的愚蠢帮手启动
label17.Text = (comboBox1.SelectedIndex * (Convert.ToInt32(label16.Text))).ToString();

然后滚动

lettergen

此方法不适用于生产级代码,但允许使用 在实验时加快代码流失速度。

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

答案 1 :(得分:2)

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

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

github还有一个例子:https://github.com/golang/sys/tree/master/windows/svc/example