PowerShell 默认不支持 Composer 交互式命令,因未启用虚拟终端模式导致 ANSI 序列失效;需通过 SetConsoleMode 启用 ENABLE_VIRTUAL_TERMINAL_PROCESSING 等标志,并配置 UTF8 编码与环境变量。

PowerShell 默认不支持 Composer 的交互式命令(比如 composer create-project 中的选项选择、composer init 的问答流程),根本原因是它未启用虚拟终端(Virtual Terminal)模式,导致 ANSI 转义序列被忽略,光标控制、颜色、行内刷新等功能全部失效。
确认 PowerShell 是否启用虚拟终端支持
Composer 依赖 ANSI 控制序列实现交互 UI(如清屏、光标定位、高亮)。Windows 10 1607+ 的 PowerShell 默认已支持,但可能被禁用或绕过。运行以下命令验证:
Get-ItemProperty HKCU:\Console | Select-Object VirtualTerminalLevel
若返回 VirtualTerminalLevel : 0,说明被手动关闭;若无此属性或值为 1,则已启用。多数问题出在旧版 ConHost 或第三方终端(如 Windows Terminal 未正确配置)。
强制启用 PowerShell 虚拟终端(适用于 Windows 10/11)
在当前会话中立即生效(无需重启):
- 执行
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8—— 避免中文路径或包名乱码 - 执行
$env:COMPOSER_NO_INTERACTION="0"—— 确保不意外进入非交互模式 - 最关键一步:运行
[System.Console]::TreatControlCAsInput = $true并设置终端模式:$signature = @' [DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr GetStdHandle(int nStdHandle); '@ $type = Add-Type -MemberDefinition $signature -Name Win32Utils -Namespace Console -PassThru $handle = $type::GetStdHandle(-11) $type::SetConsoleMode($handle, 7)其中7是ENABLE_PROCESSED_INPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING | ENABLE_LINE_INPUT的组合值
永久生效的最小化配置(不改系统策略)
把终端初始化逻辑写进 PowerShell 配置文件,每次启动自动加载:
- 运行
notepad $PROFILE(若提示不存在,先执行New-Item -Path $PROFILE -Force) - 在文件末尾添加:
if ($host.Name -eq 'ConsoleHost') { $signature = @' [DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr GetStdHandle(int nStdHandle); '@ $type = Add-Type -MemberDefinition $signature -Name Win32Utils -Namespace Console -PassThru $handle = $type::GetStdHandle(-11) $type::SetConsoleMode($handle, 7) [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 } - 保存后重启 PowerShell,再运行
composer init测试光标移动、回退、颜色是否正常
替代方案:绕过 PowerShell 终端限制
如果上述仍失败(常见于某些企业锁死的 ConHost 或远程桌面会话),可临时降级兼容性:
- 改用
cmd.exe运行 Composer:PowerShell 中执行cmd /c "composer create-project laravel/laravel test" - 用
composer --no-interaction跳过所有交互(适合 CI 或脚本化部署) - 避免使用需实时输入的命令,例如改用
composer.json手动编写 +composer install - 升级到 Windows Terminal(Microsoft Store 免费安装),它默认启用完整 VT 支持,且比原生 PowerShell 控制台更可靠
真正卡住的地方往往不是 Composer 本身,而是 Windows 终端子系统对 ANSI 序列的处理层级被跳过或拦截——哪怕只漏掉 ENABLE_VIRTUAL_TERMINAL_PROCESSING 这一个标志位,symfony/console 渲染的进度条和选择菜单就会彻底瘫痪。










