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

Dri*_*Rey 3 powershell user-interface batch-file

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

powershell.exe -WindowStyle Hidden -file c:\script.ps1
Run Code Online (Sandbox Code Playgroud)

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

Blu*_*kes 14

如果你想在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)
}
Run Code Online (Sandbox Code Playgroud)

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

$OnFormLoad = 
{
    Hide-Console
}
Run Code Online (Sandbox Code Playgroud)

如果您需要显示控制台,也许是为了进行调试,您可以通过调用该Show-Console函数轻松地再次显示控制台:

$OnButtonClick = 
{
    Show-Console
}
Run Code Online (Sandbox Code Playgroud)

有关您可以传递给的数字的更多信息,可以在此处查看MSDN上ShowWindowShowWindow文档

根据评论更新

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

要使用此代码隐藏控制台,您只需要调用Hide-Console.由于你已经在Shownevent($objForm.Add_Shown)中有代码,我们可以简单地添加另一行来调用命令:

改变这个:

$objForm.Add_Shown({$objForm.Activate()})
Run Code Online (Sandbox Code Playgroud)

对此:

$objForm.Add_Shown({
    $objForm.Activate()
    Hide-Console
})
Run Code Online (Sandbox Code Playgroud)

当您的表单Shown被隐藏时,控制台将被隐藏(Show-Console如果您想稍后再看,您仍然可以调用).


Ico*_*niu 5

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

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle Hidden -file "C:\path\whatever.ps1"
Run Code Online (Sandbox Code Playgroud)

如果你想从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
Run Code Online (Sandbox Code Playgroud)

作为奖励,如果您使用 param() 语句启动whatever2.ps1,则可以传递命名的必需参数。只要确保它是 ps1 文件中的第一件事,甚至在程序集之前。

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