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

Go 如何通过exec os/exec执行sc create命令?,go,service,cmd,exec,sc,Go,Service,Cmd,Exec,Sc,如何通过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(

如何通过
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))
这是我在命令提示符下得到的(在当前命令提示符下打开命令提示符--):

无法执行以下命令。我什么也没得到!问题在哪里

如果在当前命令提示符下执行
sc.exe
,则命令已启动,但如果在新命令提示符下执行,则命令未启动


也就是说,如果我删除了第一个参数“cmd.exe”,我的程序就成功地执行了,结果是异常的。但是如何在新窗口中执行呢?

好吧,眼前的问题是,你所做的不是告诉你如何执行一个外部命令以使它执行一个命令,你应该传递
cmd.exe
或者
/K
命令行选项, 喜欢

您在调用中观察到的是
cmd.exe
忽略了 其余的参数传递给它,然后运行,这就是 正是你所观察到的

首先研究
cmd.exe/?
的输出和 内置Windows帮助系统,以便更好地了解其工作原理

下一个问题是,绝对没有理由让
cmd.exe
参与运行
sc
——直接运行
sc
,而不是跳转
cmd.exe
,让它执行
sc

下一个问题是您忽略了返回的错误值 通过调用
os/exec.Cmd.Output
。既然去(幸运的)不去 如果有例外,处理所有错误值至关重要 重要的是,最好忽略其他一切,但不要忽略 错误。 如果您正在编写高度实验性的代码,您可能会 从一个愚蠢的助手开始,比如

func check(err error) {
    if err != nil {
        panic(err)
    }
}
然后像这样滚动

out, err := cmd.Output()
check(err)
此方法不适用于生产等级代码,但允许 为了在实验时更快地进行代码转换

您也可以考虑直接调用Win32 API到 管理服务,因为它将进行错误处理


更简单。

好吧,眼前的问题是,你要做的不是告诉你如何执行一个外部命令,让它执行一个,你应该通过
cmd.exe
或者
/K
命令行选项, 喜欢

您在调用中观察到的是
cmd.exe
忽略了 其余的参数传递给它,然后运行,这就是 正是你所观察到的

首先研究
cmd.exe/?
的输出和 内置Windows帮助系统,以便更好地了解其工作原理

下一个问题是,绝对没有理由让
cmd.exe
参与运行
sc
——直接运行
sc
,而不是跳转
cmd.exe
,让它执行
sc

下一个问题是您忽略了返回的错误值 通过调用
os/exec.Cmd.Output
。既然去(幸运的)不去 如果有例外,处理所有错误值至关重要 重要的是,最好忽略其他一切,但不要忽略 错误。 如果您正在编写高度实验性的代码,您可能会 从一个愚蠢的助手开始,比如

func check(err error) {
    if err != nil {
        panic(err)
    }
}
然后像这样滚动

out, err := cmd.Output()
check(err)
此方法不适用于生产等级代码,但允许 为了在实验时更快地进行代码转换

您也可以考虑直接调用Win32 API到 管理服务,因为它将进行错误处理


更简单。

有点晚了,而且不太适合运行sc.exe。虽然在回答@ KOSITX提供中解决了使用SC.EXE的问题,但我发现您正在尝试创建一个GO应用程序的服务,并将其视为XY问题。

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


github上也有一个例子:

有点晚了,实际上并不是关于运行sc.exe。虽然在回答@ KOSITX提供中解决了使用SC.EXE的问题,但我发现您正在尝试创建一个GO应用程序的服务,并将其视为XY问题。

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


github上还有一个例子:

注意,在您的案例中根本不需要
cmd.exe
。注意,在您的案例中根本不需要
cmd.exe