Windows 11中PowerShell -WindowStyle Hidden参数未隐藏控制台窗口反而最小化的原因咨询
嘿,这个问题我之前帮朋友排查过,其实核心是两层窗口的控制权逻辑在Windows 11里有特殊表现,咱们慢慢拆解:
首先得搞清楚前提:你写的是批处理文件(.bat/.cmd),它运行时会先启动一个由conhost.exe(Windows控制台宿主进程)托管的cmd.exe窗口,所有批处理里的命令都是在这个窗口环境下执行的。
先看第一个能正常最小化的命令:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -WindowStyle Minimize ;exit notepad.exe
这里的-WindowStyle Minimize是指定PowerShell自身的窗口以最小化状态启动,而因为PowerShell是在cmd的控制台窗口中运行的,它会同步影响父窗口的状态,所以你看到整个控制台窗口都变成了最小化,等PowerShell退出后,cmd会继续执行后续的notepad.exe命令。
再看第二个用了-WindowStyle Hidden的命令:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -WindowStyle Hidden ;exit notepad.exe
这个参数确实生效了——它把PowerShell自己的窗口完全隐藏了,但它管不了父进程cmd的控制台窗口啊!那为什么窗口会变成最小化而不是留在前台?这是Windows 11里conhost.exe的新行为:当控制台里的活跃子进程(也就是这里的PowerShell)以隐藏状态退出后,conhost会自动把托管的cmd窗口切换到最小化状态——因为此时控制台里没有正在运行的交互式进程了,但批处理还没执行完(接下来要启动记事本),所以不能直接关闭窗口,只能以最小化的状态保留,直到批处理完全结束。
总结一下就是:-WindowStyle Hidden只对PowerShell自身的窗口生效,无法影响调用它的批处理控制台窗口;而Windows 11的控制台宿主在这种特殊场景下,会把闲置的批处理窗口自动设为最小化,这就造成了“参数没隐藏窗口反而最小化”的错觉。
备注:内容来源于stack exchange,提问作者Amazon Dies In Darkness

