首页 > 解决方案 > powershell 不将变量扩展为参数

问题描述

我在 powershell 脚本中执行了以下命令:

$boostPath = "D:/lib/boost/1.62.0-vs2013-x64"
cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT=$boostPath

有了这个,变量$boostPath不会被扩展。我可以在FindBoost日志中看到

-- [ C:/Program Files/CMake/share/cmake-3.18/Modules/FindBoost.cmake:1528 ] BOOST_ROOT = "$boostPath"

相反,如果在我写的脚本中

cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT="D:/lib/boost/1.62.0-vs2013-x64"

变量设置正确并且 cmake 工作。如何使用变量正确给出参数?

标签: powershellvariablescmakearguments

解决方案


Mathias R. Jessen在评论中提供了关键指针:

PowerShell 将诸如此类的标记-DBOOST_ROOT=$boostPath解析为文字$boostPath-变量引用无法识别,因此无法扩展(由其值替换)。

此 GitHub 问题总结了 PowerShell 有时使用未引用的复合标记的令人惊讶的行为。

如果不包含空格,以下内容通常应该有效并且绝对有效:$boostPath

cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT="$boostPath"

变量引用的双引号会强制其扩展。

注意

  • 由于 PowerShell仅在需要时才在后台执行重新引用,从而保留双引号(可能从单引号转换而来)并且您的路径不包含空格,因此在命令行上将看到的是逐字记录- 没有引号。cmake
    -DBOOST_ROOT=D:/lib/boost/1.62.0-vs2013-x64

  • 如果$boostPath 确实包含空格,例如,PowerShell 会将参数作为一个整体$boostPath = "D:/lib 1/boost/1.62.0-vs2013-x64"双引号,以便在命令行上看到的内容是逐字记录的cmake
    "-DBOOST_ROOT=D:/lib 1/boost/1.62.0-vs2013-x64"

    • 如果cmake在 Windows [1]上确实需要仅"..."围绕该$boostPath值(某些 CLI,尤其是msiexec不幸地需要),请使用此解决方法(为简洁起见省略了一个参数):
cmake -S $cmakeRootPath -B $buildPath -DBOOST_ROOT="`"$boostPath`""

警告:如果 PowerShell 对传递给外部程序的参数的损坏(重新)引用(请参阅此答案)应该得到修复(请参阅此 GitHub 问题),则此解决方法将中断


[1] 只有在 Windows 上,(控制台)程序需要自己将整个命令行解析为单独的参数;在类 Unix平台上,它们明智地接收到一系列逐字标记


推荐阅读