PowerShell默认阻止执行本地.ps1脚本,需运行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser临时授权;.\composer-setup.php是PHP脚本,须显式用php .\composer-setup.php执行,不可直接双击或调用。

PowerShell 默认阻止执行本地脚本,所以直接双击或 .\install.ps1 会报错 ExecutionPolicy 拒绝——这不是 Composer 问题,是 Windows 安全策略在起作用。
为什么 .\composer-setup.php 在 PowerShell 里不工作
PowerShell 默认不执行 PHP 脚本(哪怕后缀是 .php),它只认 .ps1;而官方 Composer 安装脚本是 PHP 写的,必须由 php.exe 解释。直接运行会提示“无法加载文件,因为在此系统上禁止运行脚本”或者干脆当成文本输出。
- 别用
.\composer-setup.php,那是给命令行(cmd)+ php 环境准备的,不是 PowerShell 脚本 - 正确做法是显式调用
php:php .\composer-setup.php - 确保
php在 PATH 中,否则会报The term 'php' is not recognized
如何安全启用 PowerShell 执行本地 .ps1 脚本(如自定义安装脚本)
如果你自己写了 install.ps1 来封装 Composer 下载/校验/移动逻辑,必须绕过 ExecutionPolicy 限制,但不能全局设为 Unrestricted(太危险)。
- 临时生效(推荐):启动 PowerShell 时加参数
powershell -ExecutionPolicy Bypass -File .\install.ps1 - 仅对当前会话生效:运行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser(需要管理员权限才影响系统级策略) - 绝对不要运行
Set-ExecutionPolicy Unrestricted—— 这会让所有未签名脚本无条件运行,包括钓鱼脚本 - 检查当前策略:运行
Get-ExecutionPolicy -List,重点关注CurrentUser行
Invoke-WebRequest 下载 Composer.phar 时的常见坑
很多人用 PowerShell 的 Invoke-WebRequest 替代 curl 下载 composer.phar,但默认行为容易出错:
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
- 不加
-OutFile参数,内容会输出到控制台而非保存为文件,导致php composer.phar --version报错No input file specified - 必须加
-UseBasicParsing,否则在 Server Core 或某些受限环境中会因缺少 IE 组件失败 - 下载地址要用 HTTPS 官方源:
https://getcomposer.org/installer,别用 HTTP 或镜像站的非校验链接 - 示例安全写法:
Invoke-WebRequest -Uri "https://getcomposer.org/installer" -OutFile "composer-setup.php" -UseBasicParsing
安装后 composer 命令仍不可用?检查 PATH 和文件扩展名关联
即使你把 composer.phar 放进了 C:\bin 并加到了 PATH,Windows 仍可能找不到——因为默认没把 .phar 关联到 php.exe。
- 最稳方案:重命名为
composer.bat,内容只有一行:@php "%~dp0composer.phar" %* - 或者用
php composer.phar install显式调用(适合 CI/CD 脚本) - 验证是否生效:新开一个 PowerShell 窗口,运行
composer --version;如果报command not found,说明 PATH 没刷新或文件没放对位置 - 别把
composer.phar直接扔进C:\Windows\System32—— UAC 和 Defender 可能拦截执行
真正卡住人的往往不是 Composer 本身,而是 Windows 对脚本执行、文件扩展名、PATH 刷新这三者的隐式耦合。每一步都建议在新 PowerShell 窗口中验证,避免缓存和会话状态干扰判断。










