簡體   English   中英

如何通過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"我的程序將成功執行,但結果除外。 但是如何在新窗口中執行?

好吧,眼前的問題是,您要做的不是如何告訴cmd.exe執行外部命令-為了使其執行一個外部命令,您應該將/C/K命令行選項傳遞給cmd.exe , 像

C:\>cmd.exe /C sc whatever sc_arg1 sc_arg2 ...

您在呼叫中觀察到的結果是cmd.exe忽略傳遞給它的其余參數,然后繼續運行,這就是您所觀察的。

從研究cmd.exe /?的輸出開始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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM