如何通过 exec os/exec 执行 sc create 命令?
How can i execute sc create command through exec os/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"
,我的程序会成功执行并出现异常结果。但是如何在新的window中执行?
嗯,直接的问题是你所做的不是告诉 cmd.exe
执行外部命令的方式——为了让它执行一个命令,你应该传递 cmd.exe
/C
或 /K
命令行选项,
喜欢
C:\>cmd.exe /C sc whatever sc_arg1 sc_arg2 ...
您在通话中观察到 cmd.exe
忽略了
你传递给它的其余参数和 运行s——就是这样
正是您所观察到的。
从研究 cmd.exe /?
的输出和
内置 Windows 帮助系统以更好地了解其工作原理。
下一个问题是,绝对没有理由让cmd.exe
参与运行宁sc
——直接运行 sc
而不是跳转 cmd.exe
使其执行 sc
.
下一个问题是您忽略了返回的错误值
通过调用 os/exec.Cmd.Output
。因为 Go(幸运的是)没有
有例外,处理所有错误值是最重要的
重要性——最好忽略其他一切,但不要
错误。
如果您正在编写高度实验性的代码,您可能
开始 像
这样的笨帮手
func check(err error) {
if err != nil {
panic(err)
}
}
然后翻滚
out, err := cmd.Output()
check(err)
此方法不适用于生产级代码,但允许
以便在试验时更快地修改代码。
您也可以考虑直接调用 Win32 API
管理服务,因为它会大量处理错误
更容易。
有点晚了,并不是关于 运行 sc.exe。虽然在@kostix 提供的答案中解决了使用 SC.exe 的问题,但我看到您正在尝试创建 Go 应用程序的服务并认为这是一个 XY 问题。
单次调用 sc.exe
不太可能成功创建 windows 服务。但是,有一个库可以提供帮助:golang.org/x/sys/windows/svc
。
github上还有一个例子:https://github.com/golang/sys/tree/master/windows/svc/example
如何通过 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"
,我的程序会成功执行并出现异常结果。但是如何在新的window中执行?
嗯,直接的问题是你所做的不是告诉 cmd.exe
执行外部命令的方式——为了让它执行一个命令,你应该传递 cmd.exe
/C
或 /K
命令行选项,
喜欢
C:\>cmd.exe /C sc whatever sc_arg1 sc_arg2 ...
您在通话中观察到 cmd.exe
忽略了
你传递给它的其余参数和 运行s——就是这样
正是您所观察到的。
从研究 cmd.exe /?
的输出和
内置 Windows 帮助系统以更好地了解其工作原理。
下一个问题是,绝对没有理由让cmd.exe
参与运行宁sc
——直接运行 sc
而不是跳转 cmd.exe
使其执行 sc
.
下一个问题是您忽略了返回的错误值
通过调用 os/exec.Cmd.Output
。因为 Go(幸运的是)没有
有例外,处理所有错误值是最重要的
重要性——最好忽略其他一切,但不要
错误。
如果您正在编写高度实验性的代码,您可能
开始 像
func check(err error) {
if err != nil {
panic(err)
}
}
然后翻滚
out, err := cmd.Output()
check(err)
此方法不适用于生产级代码,但允许 以便在试验时更快地修改代码。
您也可以考虑直接调用 Win32 API 管理服务,因为它会大量处理错误 更容易。
有点晚了,并不是关于 运行 sc.exe。虽然在@kostix 提供的答案中解决了使用 SC.exe 的问题,但我看到您正在尝试创建 Go 应用程序的服务并认为这是一个 XY 问题。
单次调用 sc.exe
不太可能成功创建 windows 服务。但是,有一个库可以提供帮助:golang.org/x/sys/windows/svc
。
github上还有一个例子:https://github.com/golang/sys/tree/master/windows/svc/example