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
Libérer: 2024-12-09 02:00:12
original
645 Les gens l'ont consulté

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.
}
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal