Opening PowerShell Script and hide Command Prompt, but not the GUI

后端 未结 4 2136
深忆病人
深忆病人 2020-12-11 06:54

I currently open my PowerShell script through a .bat file. The script has a GUI. I tried to put this in my script but it hid the GUI as well and also kept looping because I

相关标签:
4条回答
  • 2020-12-11 07:20

    If you want to hide the Console behind the GUI I've had success with the following native functions:

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

    Once the above functions have been added to your Form, simply call the Hide-Console function in your Form_Load event:

    $OnFormLoad = 
    {
        Hide-Console
    }
    

    If you need to show the Console, perhaps for debugging, you can easily show the console again by calling the Show-Console function:

    $OnButtonClick = 
    {
        Show-Console
    }
    

    For more information on the numbers you can pass to ShowWindow you can check out the ShowWindow documentation on MSDN here

    Update based on comment

    Thanks for this code. I tried to use it in my script, but where exactly am I suppose to put Hide-Console? My form load looks like this $objForm.Add_Shown({$objForm.Activate()}) [void] $objForm.ShowDialog()

    To hide the console with this code, all you need to do is call Hide-Console. Since you already have code in the Shown event ($objForm.Add_Shown) we can simply add another line to call the command:

    Change this:

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

    To this:

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

    When your form is Shown the console will be hidden (You can still call Show-Console if you want to see it later).

    0 讨论(0)
  • 2020-12-11 07:29

    If you run PowerShell from a shortcut with the window set to minimized, it will briefly flash a cmd icon in the taskbar but you barely notice it. Yet, it will start your PowerShell GUI without having a console window behind it.

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

    If you want to start a second GUI console window from whatever.ps1 without it stopping the processing on whatever.ps1 you need to use start-process. However, start-process with -WindowStyle hidden prevents the GUI from showing up. Removing -WindowStyle shows a command window behind your GUI. However, if you start-process with cmd.exe /k, it does work.

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

    As a bonus, if you start whatever2.ps1 with a param() statement, you can pass named, required arguments. Just be sure it's the very first thing in the ps1 file, before assemblies even.

    param (
      [Parameter(Mandatory=$true)]
      [string]$var1
    )
    $argumentlist = "/c powershell.exe -file `"C:\path\whatever2.ps1`" -param1 `"param1string`""
    
    0 讨论(0)
  • 2020-12-11 07:34

    In the solution proposed posted in a comment (*

    Put it in a shortcut instead of in a batch file. Right click a blank spot on desktop or in a folder window, New, Shortcut, paste your line in, Next, name it, Finish

    *.) to hide definitely the Command Prompt, I set, in the properties of the shortcut Run=minimized in General.

    0 讨论(0)
  • 2020-12-11 07:43

    Simplified the function for show hide a bit

    function Show-Console
    {
        param ([Switch]$Show,[Switch]$Hide)
        if (-not ("Console.Window" -as [type])) { 
    
            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);
            '
        }
    
        if ($Show)
        {
            $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
    
            $null = [Console.Window]::ShowWindow($consolePtr, 5)
        }
    
        if ($Hide)
        {
            $consolePtr = [Console.Window]::GetConsoleWindow()
            #0 hide
            $null = [Console.Window]::ShowWindow($consolePtr, 0)
        }
    }
    

    show-console -show

    show-console -hide

    0 讨论(0)
提交回复
热议问题