打开PowerShell脚本并隐藏命令提示符,但不隐藏GUI

时间:2016-11-15 19:08:27

标签: powershell user-interface batch-file

我目前通过.bat文件打开我的PowerShell脚本。该脚本具有GUI。我试着将它放在我的脚本中,但它也隐藏了GUI并且还保持循环,因为我希望我的GUI不断循环:

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

我们如何在没有Command Promp的情况下运行脚本,但也不隐藏gui?如果我们使用.bat文件运行脚本,那是相同的吗?谢谢!

4 个答案:

答案 0 :(得分:10)

如果您想隐藏GUI后面的控制台,我已成功使用以下本机功能:

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

将上述功能添加到您的表单后,只需致电Hide-Console活动中的Form_Load功能:

$OnFormLoad = 
{
    Hide-Console
}

如果您需要显示控制台,可能需要调试,您可以通过调用Show-Console函数轻松再次显示控制台:

$OnButtonClick = 
{
    Show-Console
}

有关您可以传递给ShowWindow的号码的详细信息,请查看ShowWindow documentation on MSDN here

根据评论进行更新

  

感谢您提供此代码。我尝试在我的脚本中使用它,但我想在哪里放置Hide-Console?我的表单加载看起来像$ objForm.Add_Shown({$ objForm.Activate()})[void] $ objForm.ShowDialog()

要使用此代码隐藏控制台,您只需拨打Hide-Console即可。由于您已在Shown事件($objForm.Add_Shown)中拥有代码,因此我们只需添加另一行来调用该命令:

改变这个:

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

对此:

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

当您的表单为Shown时,控制台将被隐藏(如果您想稍后再看,可以拨打Show-Console。)

答案 1 :(得分:0)

如果从窗口设置为最小化的快捷方式运行PowerShell,它将在任务栏中短暂闪烁一个cmd图标,但您几乎没有注意到它。然而,它将启动您的PowerShell GUI而不需要它背后的控制台窗口。

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

如果你想从whatever.ps1启动第二个GUI控制台窗口而不停止对whatever.ps1的处理,你需要使用start-process。但是,隐藏-WindowStyle的启动过程会阻止GUI显示。删除-WindowStyle显示GUI后面的命令窗口。但是,如果使用cmd.exe / k开始处理,它确实有效。

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

作为奖励,如果你使用param()语句启动whatever2.ps1,你可以传递命名的必需参数。在组装之前,确保它是ps1文件中的第一件事。

param (
  [Parameter(Mandatory=$true)]
  [string]$var1
)
$argumentlist = "/c powershell.exe -file `"C:\path\whatever2.ps1`" -param1 `"param1string`""

答案 2 :(得分:0)

简化了显示隐藏功能

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

答案 3 :(得分:0)

在建议的解决方案中发表评论(*

将其放入快捷方式而不是批处理文件中。右键单击空白 在桌面或文件夹窗口中找到,新建,快捷方式,粘贴您的行 在,接下来,命名它,完成

*。)绝对隐藏我设置的命令提示符(在常规中,Run = minimized的快捷方式)。