问题是,当您从 PowerShell调用时(与 from 不同cmd.exe
),命令名称dotenv
解析为PowerShell script,即dotenv.ps1
,正如您报告的那样。
当 PowerShell 调用 PowerShell原生命令(包括.ps1
文件)时,它自己的参数绑定器会解释(第一个)--
参数并将其删除;也就是说,目标命令永远不会看到它。( 的语义--
类似于 Unix 实用程序的语义:--
告诉参数绑定器将后续参数视为位置参数,即使它们看起来像参数(选项)名称,例如-foo
.)
因此,不幸的是,您需要指定--
两次才能将单个--
实例传递给.ps1
脚本本身:
# The first '--' is removed by PowerShell's parameter binder.
# The second one is then received as an actual, positional argument by
# dotenv.ps1
dotenv -e .\.env -- -- pnpm dev --filter api
或者,假设也存在dotenv.cmd
,即 CLI 的批处理文件版本(并且也在 列出的目录中$env:PATH
),您可以通过显式调用它来绕过这个问题,而不是.ps1
; 调用外部程序(包括由其他 shell/脚本引擎解释的脚本,例如cmd.exe
)时,PowerShell不会删除--
:
# Calling the batch-file form of the command doesn't require
# passing '--' twice.
dotenv.cmd -e .\.env -- pnpm dev --filter api
警告:虽然它通常无关紧要,但批处理文件解析其参数的方式与 PowerShell 对其本机命令的解析方式不同。