PowerShell 里 && 不能用来连接命令

命令行难度 1/5约 1 分钟

问题现象

从各种教程里复制命令,一到 Windows 的 PowerShell 就报错:

text
所在位置 行:1 字符: 17
+ npm run build && npm run serve
+                ~~
标记“&&”不是此版本中的有效语句分隔符。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

同样的命令在 Git Bash、macOS 的 zsh、Linux 的 bash 里都正常,所以很容易以为是命令本身写错了。

排查过程

  1. 先确认自己用的是哪一个 PowerShell:
powershell
$PSVersionTable.PSVersion

输出 Major 5 说明是 Windows 自带的 Windows PowerShell 5.1;输出 Major 7 才是 PowerShell 7(命令名是 pwsh)。

  1. 再确认 && 到底属于哪个版本:
powershell
# 5.1 会在这里报错
$true && Write-Host ok

根因

&& 和 || 是 PowerShell 7 才引入的「管道链运算符」。Windows 10 / 11 自带的 Windows PowerShell 5.1 不认这两个符号,powershell.exe 和 pwsh.exe 是两个不同的程序。

解决办法

在 5.1 里按需求选一种:

powershell
# 1) 只想依次执行,不管前一条是否成功 —— 用分号
npm run build; npm run serve

# 2) 前一条成功才执行下一条 —— 用 $?
npm run build; if ($?) { npm run serve }

# 3) 前一条失败才执行 —— 反过来判断
npm run build; if (-not $?) { Write-Host "构建失败" }

想直接用 &&,就装 PowerShell 7:

powershell
winget install --id Microsoft.PowerShell --source winget

# 之后用 pwsh 运行,注意不是 powershell
pwsh -Command "npm run build && npm run serve"

最后一条命令我加了说明:调用 pwsh 时如果命令里有引号, 建议写成 pwsh -Command '...' 或者放进脚本文件,避免两层引号打架。

相关问题

PowerShell 重定向写出中文乱码

命令行难度 2/5约 2 分钟

用 Out-File 或 > 生成的中文文件被其它程序读成乱码,原因是 Windows PowerShell 默认不写 UTF-8。

端口被占用导致开发服务器打开的是旧实例

环境配置难度 2/5约 2 分钟

启动开发服务器报 EADDRINUSE,而「以为没生效」的页面其实是上一次没关掉的进程在响应。