PowerShell终端标题设置后被后续命令覆盖如何解决?
问题
我写了一份PowerShell脚本,用来打开多个PowerShell终端,切换到不同目录并运行对应目录下的应用:
start powershell @' $host.ui.RawUI.WindowTitle = "application 1" cd application1\backend npm install npm run build npm run start '@ start powershell @' $host.ui.RawUI.WindowTitle = "application 2" cd application2\backend npm install npm run build npm run start '@ start powershell @' $host.ui.RawUI.WindowTitle = "application 3" cd application3\backend npm install npm run build npm run start '@
现在的问题是,每个终端设置的标题会被后续执行的命令替换,比如application1的终端标题会依次变成“npm install”“npm run build”“npm run start”。
我试过把标题设置放在命令最后:
start powershell @' cd application1\backend npm install npm run build npm run start $host.ui.RawUI.WindowTitle = "application 1" '@
但因为npm run start启动的应用需要按Ctrl+C才会退出,标题始终停留在“npm run start”。请问怎么让终端标题固定不变?
解决方案
方法1:重写Prompt函数禁用标题自动更新
PowerShell默认会在执行命令时自动更新窗口标题,你可以在子会话里先设置标题,再重写prompt函数,让它只输出提示符、不修改标题:
start powershell @' # 设置窗口标题 $host.ui.RawUI.WindowTitle = "application 1" # 重写prompt函数,仅输出默认提示符格式,不改动标题 function prompt { "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) " } cd application1\backend npm install npm run build npm run start '@
后续执行任何命令时,标题都会保持你设置的内容,不会被自动覆盖。
方法2:用Windows Terminal的wt命令指定标题(适用于Windows Terminal)
如果你使用Windows Terminal,可以直接通过wt命令启动标签页并锁定标题,终端内的命令不会修改这个标题:
wt -w 0 new-tab --title "application 1" powershell -Command "cd application1\backend; npm install; npm run build; npm run start" wt -w 0 new-tab --title "application 2" powershell -Command "cd application2\backend; npm install; npm run build; npm run start" wt -w 0 new-tab --title "application 3" powershell -Command "cd application3\backend; npm install; npm run build; npm run start"
方法3:用.NET类设置标题并禁用自动更新
通过.NET的[Console]::Title设置标题,同时清空PowerShell自动更新标题的变量,阻止后续自动替换:
start powershell @' [Console]::Title = "application 1" # 禁用PowerShell的标题自动更新逻辑 $host.PrivateData.WindowTitle = $null cd application1\backend npm install npm run build npm run start '@
内容的提问来源于stack exchange,提问作者Gibran Shah
相关产品推荐
相关产品推荐

