[英]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 工作。 如何使用变量正确给出参数?
诸如-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.