如何通过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"
,我的程序会成功执行,并使用例外结果。但是如何在新窗口中执行?
答案 0 :(得分:2)
嗯,直接的问题是你做的不是cmd.exe
应该如何告诉你执行一个外部命令 - 为了让它执行一个,你应该cmd.exe
/C
/K
1}}或C:\>cmd.exe /C sc whatever sc_arg1 sc_arg2 ...
命令行选项,
喜欢在
cmd.exe
您通过电话观察到的是cmd.exe /?
忽略了
你传递给它的其余论点只是运行 - 那就是
正是你所观察到的。
首先研究cmd.exe
和sc
的输出
内置的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