为何在PowerShell脚本中设置终端标题时出现错误?
我编写了一个.ps1脚本,用于打开多个PowerShell终端并在每个终端中启动Node.js应用。为便于区分各终端对应的应用,我使用$host.ui.RawUI.WindowTitle = "my application"设置终端标题。脚本示例如下:
start powershell { $host.ui.RawUI.WindowTitle = "application 1" cd application1\backend npm install npm run build npm run start Read-Host } start powershell { $host.ui.RawUI.WindowTitle = "application 2" cd application2\backend npm install npm run build npm run start Read-Host } start powershell { $host.ui.RawUI.WindowTitle = "application 3" cd application3\backend npm install npm run build npm run start Read-Host } ...
脚本中此类代码块不止3个。运行脚本时,终端出现如下错误:
application : 术语“application”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请验证路径是否正确,然后重试。
所在位置 行:3 字符:31
- $host.UI.RawUI.WindowTitle = application 1
~~~~~~~~~~~
- CategoryInfo : ObjectNotFound: (application:String) [], CommandNotFoundException
- FullyQualifiedErrorId : CommandNotFoundException
我知道$host.UI.RawUI.WindowTitle = "application 1"在终端提示符下可正常运行,为何在脚本中无法生效?
问题根源在于脚本块的序列化逻辑:当你通过start powershell { ... }传递脚本块时,PowerShell会自动将脚本块转换为字符串,但这个过程会丢失双引号,导致原本的"application 1"被解析成application 1——PowerShell会把application误认为是一个命令,因此抛出错误。
而直接在终端提示符下运行时,PowerShell会直接解析命令,双引号能被正确识别为字符串边界,所以不会出问题。
你可以用两种方式修正:
方式一:改用单引号包裹标题字符串
单引号在脚本块序列化时不会被丢失,能保持字符串的完整性:
start powershell { $host.ui.RawUI.WindowTitle = 'application 1' cd application1\backend npm install npm run build npm run start Read-Host }
方式二:显式使用-Command参数传递命令字符串
把要执行的命令整合成字符串,用-Command参数传递,内部双引号用反引号转义:
start powershell -Command "$host.ui.RawUI.WindowTitle = `"application 1`"; cd application1\backend; npm install; npm run build; npm run start; Read-Host"
如果命令较长,也可以用Here-String来提升可读性:
$app1Script = @' $host.ui.RawUI.WindowTitle = "application 1" cd application1\backend npm install npm run build npm run start Read-Host '@ start powershell -Command $app1Script
内容的提问来源于stack exchange,提问作者gib65

