Maison >développement back-end >Golang >Comment puis-je empêcher l'apparition de la fenêtre d'invite de commande lors de l'utilisation de « exec.Command() » dans Go ?

Comment puis-je empêcher l'apparition de la fenêtre d'invite de commande lors de l'utilisation de « exec.Command() » dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-09 02:00:12627parcourir

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

Masquage de la fenêtre d'invite de commande à l'aide d'Exec dans Go

Dans Go, la fonction exec.Command() peut être utilisée pour exécuter des commandes externes. Cependant, par défaut, cette fonction affiche la fenêtre d'invite de commande pendant l'exécution de la commande. Pour empêcher cette fenêtre d'apparaître, vous pouvez définir le champ HideWindow de syscall.SysProcAttr sur 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.
}

Cependant, cette méthode peut ne pas toujours fonctionner, surtout lorsqu'elle est utilisée sous Windows. Même avec HideWindow défini sur true, la fenêtre de commande peut encore apparaître brièvement.

Solution alternative

Une solution plus fiable consiste à utiliser l'appel système pour créer un nouveau processus avec l'indicateur SW_HIDE. Cela garantit que le nouveau processus s'exécute sans fenêtre visible.

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)
}

Avec cette méthode, la fenêtre d'invite de commande n'apparaîtra pas du tout lorsque exec.Command() est appelé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn