powershell - 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 工作。如何使用变量正确给出参数?
解决方案
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平台上,它们明智地接收到一系列逐字标记。
推荐阅读
- javascript - 将电子表格文件复制到 Google Drive 并将所有公式替换为值
- node.js - Firebase 功能在部署时有效,但在本地无效
- java - 仅在使用 log4j 时记录致命和错误消息
- python - functools.map 替代字典
- python - 使用 asyncio 在一个时间间隔内运行命令并在之后终止它
- javascript - 如何获取当前日期和时间
- r - ggplot2中热图的衰减函数
- android - Android Firefox 超宽全屏:最适合而不是适合屏幕?
- python - 直接从c文件夹用ide软件编辑python文件
- java - Android:如何在底部导航活动中将参数传递给片段