Ouverture du Script PowerShell et de L'invite de commande hide, mais pas de L'interface graphique

j'ouvre actuellement mon script PowerShell par un .le fichier bat. Le script a une interface graphique. J'ai essayé de mettre cela dans mon script mais il a caché L'interface graphique aussi bien et a continué à Boucler parce que je voulais que mon interface graphique continue à Boucler:

powershell.exe -WindowStyle Hidden -file c:script.ps1

comment exécuter un script sans la commande Promp, mais aussi sans cacher l'interface graphique? Et c'est la même chose si nous exécutons le script en utilisant un .le dossier bat? Je vous remercie!

1
demandé sur DrixlRey 2016-11-15 22:08:27

2 réponses

si vous voulez cacher la Console derrière L'interface graphique, j'ai eu du succès avec les fonctions natives suivantes:

# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'

function Show-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()

    # Hide = 0,
    # ShowNormal = 1,
    # ShowMinimized = 2,
    # ShowMaximized = 3,
    # Maximize = 3,
    # ShowNormalNoActivate = 4,
    # Show = 5,
    # Minimize = 6,
    # ShowMinNoActivate = 7,
    # ShowNoActivate = 8,
    # Restore = 9,
    # ShowDefault = 10,
    # ForceMinimized = 11

    [Console.Window]::ShowWindow($consolePtr, 4)
}

function Hide-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()
    #0 hide
    [Console.Window]::ShowWindow($consolePtr, 0)
}

une fois que les fonctions ci-dessus ont été ajoutées à votre formulaire, appelez simplement la fonction Hide-Console dans votre Form_Load événement:

$OnFormLoad = 
{
    Hide-Console
}

si vous devez afficher la Console, peut-être pour le débogage, vous pouvez facilement afficher à nouveau la console en appelant la fonction Show-Console :

$OnButtonClick = 
{
    Show-Console
}

pour plus d'informations sur les numéros que vous pouvez passer à ShowWindow vous pouvez consulter la documentation sur MSDN ici

mise à jour basée sur le commentaire

Merci pour ce code. J'ai essayé de l'utiliser dans mon script, mais où est-ce que je dois mettre Hide-Console? Ma charge de formulaire ressemble à ceci $ objForm.Add_Shown ({$objForm.Activate()}) [vide] $ objForm.ShowDialog ()

pour masquer la console avec ce code, il suffit d'appeler Hide-Console . Puisque vous avez déjà le code dans l'événement Shown ( $objForm.Add_Shown ) nous pouvons simplement ajouter une autre ligne pour appeler la commande:

Modifiez ce qui suit:

$objForm.Add_Shown({$objForm.Activate()})

à ceci:

$objForm.Add_Shown({
    $objForm.Activate()
    Hide-Console
})

quand votre formulaire est Shown la console sera cachée (vous pouvez toujours appeler Show-Console si vous voulez le voir plus tard).

6
répondu Bluecakes 2016-12-07 21:50:55

si vous exécutez PowerShell à partir d'un raccourci avec la fenêtre définie à minimisée, il clignotera brièvement une icône cmd dans la barre des tâches, mais vous le remarquez à peine. Pourtant, il va démarrer votre GUI PowerShell sans avoir une fenêtre de console derrière lui.

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle Hidden -file "C:\path\whatever.ps1"

si vous voulez démarrer une seconde fenêtre de console GUI à partir de n'importe quoi.ps1 sans que cela arrête le traitement sur n'importe quoi.ps1 vous devez utiliser start-process. Cependant, start-process avec-WindowStyle hidden empêche la GUI d'apparaître. Removing-WindowStyle affiche une fenêtre de commande derrière votre interface graphique. Cependant,si vous commencez-traiter avec cmd.exe / k, ça marche.

$argumentlist = "/c powershell.exe -file `"c:\path\whatever2.ps1`" -param1 `"paramstring`""
Start-Process cmd.exe -WindowStyle Hidden -ArgumentList $argumentlist

en bonus, si vous commencez quoi que ce soit 2.ps1 avec une instruction param (), vous pouvez passer les arguments named, required. Juste être sûr que c'est la toute première chose dans le fichier ps1, avant même les assemblées.

param (
  [Parameter(Mandatory=$true)]
  [string]$var1
)
$argumentlist = "/c powershell.exe -file `"C:\path\whatever2.ps1`" -param1 `"param1string`""
0
répondu Iconiu 2018-03-08 17:51:57