首頁 > 後端開發 > Golang > 在 Go 中使用 exec.Command() 時如何防止出現命令提示字元視窗?

在 Go 中使用 exec.Command() 時如何防止出現命令提示字元視窗?

Mary-Kate Olsen
發布: 2024-12-09 02:00:12
原創
631 人瀏覽過

How Can I Prevent the Command Prompt Window from Appearing When Using `exec.Command()` in Go?

在 Go 中使用 Exec 隱藏命令提示字元視窗

在 Go 中,可以使用 exec.Command() 函數來執行外部命令。但是,預設情況下,此函數在命令運行時顯示命令提示字元視窗。若要防止出現此窗口,可以將 syscall.SysProcAttr 的 HideWindow 欄位設為 true。

package main

import (
    "log"
    "os"
    "syscall"

    "github.com/pkg/exec"
)

func main() {
    process := exec.Command("cmd", "/c", "dir")
    process.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}

    err := process.Start()
    if err != nil {
        log.Print(err)
    }
    process.Wait() // Wait for the command to finish before exiting.
}
登入後複製

但是,此方法可能並不總是有效,尤其是在 Windows 中使用時。即使將 HideWindow 設為 true,命令視窗仍可能會短暫顯示。

替代解決方案

更可靠的解決方案是使用 syscall 來建立具有 SW_HIDE 標誌的新進程。這可以確保新進程在沒有可見視窗的情況下運行。

package main

import (
    "log"
    "os"
    "os/exec"
    "syscall"
)

func main() {
    cmdPath, _ := exec.LookPath("cmd")

    si := syscall.StartupInfo{
        Flags:              syscall.STARTF_USESHOWWINDOW,
        CreationFlags:      0x00000008, // SW_HIDE
    }

    pi := syscall.ProcessInformation{}
    _, _, err := syscall.CreateProcess(cmdPath, syscall.Syscall0(uintptr(len(cmdPath))), nil, nil, false, syscall.CREATE_NEW_CONSOLE, 0, nil, &si, &pi)
    if err != nil {
        log.Fatal(err)
    }
    syscall.CloseHandle(pi.Thread)
    syscall.CloseHandle(pi.Process)
    os.Exit(0)
}
登入後複製

使用此方法,在呼叫 exec.Command() 時根本不會出現命令提示字元視窗。

以上是在 Go 中使用 exec.Command() 時如何防止出現命令提示字元視窗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板