背景
我想在 PowerShell 脚本中隐藏控制台窗口。
- 编辑:我正在使 此脚本 保持常驻系统托盘图标并从任务栏隐藏。
此脚本使用 OneDrive 存储截图。当您运行此脚本时,您必须对 OneDrive 进行身份验证,因此首先不能使用
-WindowStyle Hidden
选项运行此脚本(应显示身份验证窗口)。身份验证后,我希望将终端从任务栏隐藏并显示系统托盘图标。
- 编辑:我正在使 此脚本 保持常驻系统托盘图标并从任务栏隐藏。
此脚本使用 OneDrive 存储截图。当您运行此脚本时,您必须对 OneDrive 进行身份验证,因此首先不能使用
在 Windows 11 上,当您将
Windows Console Host
设置为 Windows 终端的启动设置中的“默认终端应用程序”时,您可以像这样隐藏控制台窗口:
$windowcode = '[DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);'
$asyncwindow = Add-Type -MemberDefinition $windowcode -name Win32ShowWindowAsync -namespace Win32Functions -PassThru
$hwnd = (Get-Process -PID $pid).MainWindowHandle
if ($hwnd -ne [System.IntPtr]::Zero) {
$hidden = $asyncwindow::ShowWindowAsync($hwnd, 0)
}
问题
在Windows 11上,当您将Windows终端
设置为"默认终端应用程序"时,在Windows终端的启动设置中,您无法使用上述代码获取控制台窗口的句柄。
您可以使用以下代码获取窗口句柄,而非上述代码:
Add-Type -Name ConsoleAPI -Namespace Win32Util -MemberDefinition '[DllImport("Kernel32.dll")] public static extern IntPtr GetConsoleWindow();'
$hwnd = [Win32Util.ConsoleAPI]::GetConsoleWindow()
$hidden = $asyncwindow::ShowWindowAsync($hwnd, 0)
但是在这段代码中,ShowWindowAsync($hwnd, 0)
不能正常工作。根据ShowWindowAsync的文档,当您将0作为第二个参数传递时,它会隐藏窗口。当我运行上面的代码时,Windows终端窗口被最小化而不是隐藏。
问题
当您在Windows 11的Windows终端启动设置中将Windows Terminal
设置为“默认终端应用程序”时,如何使用PowerShell隐藏控制台窗口?
Start-Process powershell.exe -WindowStyle Hidden -Arg script_path
或者编写一个以.psm1
扩展名结尾的模块。你也可以创建一个计划任务并在其中运行你的 PowerShell。 - user13523921