我怎么能解决这个我想是 MS PowerShell 解析错误?

How can I solve this I suppose a MS PowerShell parsing error?

当我使用下面的命令 [1] 设置我的配置变量 MONGODB_URI 时,它给出了一个错误 [2]。 我正在使用 Windows PowerShell。

[1] >> heroku config:set MONGODB_URI='mongodb+srv://myprojectname:<mypassword>@cluster0.rkitj.mongodb.net/<myusername>?retryWrites=true&w=majority'

[2]系统找不到指定的文件。 'w' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

注意:myprojectnamemypasswordmyusername 是实际值的占位符。

看起来 heroku CLI 入口点是一个 批处理文件 ,正如错误消息的措辞所暗示的那样,它们是 cmd.exe' s,不是 PowerShell 的。

PowerShell 在合成要在幕后使用的实际命令行时没有考虑批处理文件 (cmd.exe) 的特殊解析需求,这涉及 重新引用 ,仅使用 double 引号,并且仅当 PowerShell 认为 需要 .

时才使用引号

在这种情况下,PowerShell 双引号(因为该值不包含 空格 ),这会中断批处理文件调用.

您有以下选择:

  • 您可以使用嵌入式引用以确保您的MONGODB_URI=...的值部分键值对用双引号传递;注意 '"..."' 引用:

    heroku config:set MONGODB_URI='"mongodb+srv://myprojectname:<mypassword>@cluster0.rkitj.mongodb.net/<myusername>?retryWrites=true&w=majority"'
    
    • 警告:这个不应该工作,目前只工作因为PowerShell向外部程序传递参数从根本上被破坏了PowerShell 7.1 - 请参阅 。如果这个问题得到修复,上面的内容就会中断。
  • 如果您的命令行不涉及任何 PowerShell 变量和表达式,您可以使用 --%, stop-parsing symbol, which, however, in general, has many limitations (see );本质上,--% 之后的所有内容都被 逐字 复制到目标命令行,除了扩展 cmd.exe 样式的环境变量引用(例如 %USERNAME% ):

    heroku config:set --% MONGODB_URI="mongodb+srv://myprojectname:<mypassword>@cluster0.rkitj.mongodb.net/<myusername>?retryWrites=true&w=majority"
    
  • 如果您愿意安装模块,您可以使用 PSv3+ 中的 ie 函数 Native module (install with Install-Module Native from the PowerShell Gallery 在 PSv5+ 中),它在内部 补偿所有 PowerShell 的参数传递和 cmd.exe 的参数解析怪癖 (它以向前兼容的方式实现,因此如果 PowerShell 本身得到修复,该功能将简单地服从 PowerShell);这样,您就可以简单地专注于满足 PowerShell 的语法要求,让 ie 处理其余的:

    # 'ie' prepended to an invocation that uses only PowerShell syntax
    ie heroku config:set MONGODB_URI='mongodb+srv://myprojectname:<mypassword>@cluster0.rkitj.mongodb.net/<myusername>?retryWrites=true&w=majority'