PowerShell窗口大小不一致:不同启动方式导致尺寸差异的原因与解决
问题原因与解决方案
问题根源
快捷方式启动PowerShell和Start-Process启动PowerShell的默认控制台配置不同,核心差异在于:
- 快捷方式会加载自身存储的控制台配置(包括字体类型、字体大小、初始窗口/缓冲区尺寸)
Start-Process调用的是系统默认的PowerShell控制台配置
两者的字体大小/类型不一致,导致相同的WindowSize(字符行列数)对应的实际窗口像素尺寸不同——字符越大,同样的行列数对应的窗口就越大。
你看到WindowSize数值相同但窗口实际大小不同,就是因为这个原因:WindowSize统计的是字符数,而非像素数。MaxPhysicalWindowSize是系统根据当前字体和屏幕分辨率计算出的最大可设置字符数,所以不同配置下这个值必然不同,且无法手动修改。
解决方法
方法1:让Start-Process复用快捷方式的控制台配置
- 保存快捷方式的控制台配置:
打开快捷方式启动的Menu.Ps1窗口,右键标题栏 → 属性,确认字体(比如Consolas 12号)、布局等设置后,点击确定(会自动保存到该快捷方式的配置中)。 - 调用快捷方式启动子脚本:
为MyScript.Ps1创建一个和Menu.Ps1完全相同配置的快捷方式,然后在Menu.Ps1中用Start-Process启动该快捷方式:
或者直接复用Menu.Ps1的快捷方式来启动子脚本,修改启动参数:$ShortcutPath = "<ScriptPath>\MyScript.lnk" Start-Process $ShortcutPath$MenuShortcutPath = "<ScriptPath>\Menu.lnk" Start-Process $MenuShortcutPath -ArgumentList "-NoProfile -Command '. ""<ScriptPath>\MyScript.ps1""'"
方法2:在脚本中强制统一字体与窗口配置
在两个脚本的开头,除了设置WindowSize,额外强制设置相同的字体和缓冲区大小(确保字体为系统支持的等宽字体):
$RawUI = $Host.UI.RawUI # 设置窗口大小(字符数) $NewWindowSize = $RawUI.WindowSize $NewWindowSize.Width = 60 $NewWindowSize.Height = 30 $RawUI.WindowSize = $NewWindowSize # 设置缓冲区大小(必须≥窗口大小) $NewBufferSize = $RawUI.BufferSize $NewBufferSize.Width = 60 $NewBufferSize.Height = 1000 $RawUI.BufferSize = $NewBufferSize # 强制设置统一字体(示例为Consolas 12号,可根据你的快捷方式配置调整) try { $Font = $RawUI.Font $Font.Name = "Consolas" $Font.Size = 12 $RawUI.Font = $Font } catch { Write-Warning "无法设置指定字体,可能需要管理员权限或字体未安装" }
方法3:通过cmd.exe的start命令加载配置
利用cmd.exe的start命令支持加载控制台配置的特性,在Start-Process中调用:
$ScriptPath = "<ScriptPath>\MyScript.ps1" Start-Process cmd -ArgumentList "/c", "start powershell.exe -NoProfile -Command '. ""$ScriptPath""' -new_console:p:`"%UserProfile%<ScriptPath>\Menu.lnk""'"
这里的-new_console:p:<快捷方式路径>会让新控制台复用指定快捷方式的配置。
内容的提问来源于stack exchange,提问作者ThePostMan
相关产品推荐
相关产品推荐

