【问题标题】:Opening PowerShell Script and hide Command Prompt, but not the GUI打开 PowerShell 脚本并隐藏命令提示符,但不是 GUI
【发布时间】:2017-03-29 19:19:48
【问题描述】:

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

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

我们如何在没有命令提示符的情况下运行脚本,但又不隐藏 gui?如果我们使用 .bat 文件运行脚本,情况是否相同?谢谢!

【问题讨论】:

  • 把它放在一个快捷方式而不是一个批处理文件中。右键单击桌面或文件夹窗口中的空白处,新建,快捷方式,粘贴您的行,下一步,命名,完成。
  • 感谢 Noodles,这成功了!我做到了%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -file "\\location\folder1\script.ps1"

标签: powershell user-interface batch-file


【解决方案1】:

如果您想将控制台隐藏在 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)
}

将上述函数添加到您的表单后,只需在您的Form_Load 事件中调用Hide-Console 函数:

$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)。

【讨论】:

  • 感谢此代码。我试图在我的脚本中使用它,但我想把 Hide-Console 放在哪里?我的表单加载看起来像这样$objForm.Add_Shown({$objForm.Activate()}) [void] $objForm.ShowDialog()
  • 我已经更新了我的答案,包括一个示例,说明如何在 Shown 事件块中调用 Hide-Console 命令。如果此答案对您有所帮助,请单击勾选接受答案以帮助其他人找到相同的答案。
【解决方案2】:

如果您从设置为最小化窗口的快捷方式运行 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`""

【讨论】:

    【解决方案3】:

    在评论中提出的解决方案(*

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

    *.) 明确隐藏命令提示符,我在快捷方式 Run=minimized in General 的属性中设置。

    【讨论】:

      【解决方案4】:

      稍微简化了显示隐藏功能

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

      显示控制台显示

      显示控制台-隐藏

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 2014-11-23
        • 2020-09-25
        • 2013-08-29
        相关资源
        最近更新 更多