繁体   English   中英

powershell 不扩展变量作为参数

[英]powershell not expands variable as argument

我在 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 工作。 如何使用变量正确给出参数?

马蒂亚斯 R。 Jessen在评论中提供了关键指针:

诸如-DBOOST_ROOT=$boostPath类的标记被 PowerShell 解析为文字- $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确实包含空格,例如$boostPath = "D:/lib 1/boost/1.62.0-vs2013-x64" , PowerShell 会将参数作为一个整体双引号,这样cmake将在命令行上看到是逐字逐句的
    "-DBOOST_ROOT=D:/lib 1/boost/1.62.0-vs2013-x64"

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM