使用 Powershell 中的 Stack,如何传递包含空格的测试参数?

Joh*_*ker 3 powershell haskell command-line-arguments haskell-stack

在堆栈外运行美味测试时,我需要将字符串“失败日志”作为美味模式参数传递。

这在 bash 中非常简单:

PS C:\Pyrethrum> stack test --fast --ta "-p \"fail log\""

但尝试使用 Powershell 实现同样的目标让我抓狂:


PS C:\Pyrethrum> stack test --fast --ta "-p ""fail"" "

当没有空间时可以工作(运行测试)


PS C:\Pyrethrum> stack test --fast --ta "-p ""fail log"" "

解析目标时出错:找不到目录:日志


PS C:\Pyrethrum> stack test --fast --ta "-p `"fail log`""

尝试安装一个名为 log 的包


PS C:\Pyrethrum> stack test --fast --ta "-p \"fail log\""

选项 --ta:未终止的字符串:endOfInput


PS C:\Pyrethrum> stack test --fast --ta "-p /fail log/ "

...构建但模式需要引号

除虫菊-0.1.0.0:测试(套件:除虫菊测试,参数:-p /失败日志/)

选项-p:无法解析模式


让它在 Powershell 中运行的正确命令行是什么?

mkl*_*nt0 6

不幸的是,PowerShell 将参数传递给外部程序的方式至少在 PowerShell 7.2.x 中被打破,并且要求您不仅要满足 PowerShell自己的有关嵌入的语法要求",还要为目标可执行文件另外\转义它们,通常使用:

 # `" is needed for PowerShell, \ is needed for stack
 stack test --fast --ta "-p \`"fail log\`""
Run Code Online (Sandbox Code Playgroud)

由于外部"..."字符串不引用 PowerShell 变量且不包含子表达式,即,由于不需要字符串插值,因此您可以使用 a '...',即文字 PowerShell 字符串,这会稍微简化问题:

 stack test --fast --ta '-p \"fail log\"'
Run Code Online (Sandbox Code Playgroud)

简而言之:要将参数中嵌入的字符从 PowerShell传递给外部程序"

  • \`"在里面使用"..."
  • \"在里面使用'...'

有关详细信息,请参阅此答案,以及有关未来潜在修复和隐藏错误的辅助函数的信息。