powershell不将变量扩展为参数
我在powershell脚本中使用了以下命令:powershell不将变量扩展为参数,powershell,variables,cmake,arguments,Powershell,Variables,Cmake,Arguments,我在powershell脚本中使用了以下命令: $boostPath = "D:/lib/boost/1.62.0-vs2013-x64" cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT=$boostPath 使用此函数,变量$boostPath不会展开。我可以在FindBoost日志中看到 相反,如果我在脚本中 cmake -S $cmakeRootPath -B $buildPa
$boostPath = "D:/lib/boost/1.62.0-vs2013-x64"
cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT=$boostPath
使用此函数,变量$boostPath不会展开。我可以在FindBoost日志中看到
相反,如果我在脚本中
cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT="D:/lib/boost/1.62.0-vs2013-x64"
变量设置正确,cmake工作正常。如何使用变量正确给出参数?在注释中提供了关键指针:
PowerShell将-DBOOST_ROOT=$boostPath这样的标记解析为文字-无法识别$boostPath变量引用,因此无法用其值替换它
PowerShell有时会使用未引用的复合令牌表现出令人惊讶的行为,总结如下
如果$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
如果Windows[1]上的cmake确实需要。。。要使某些CLI(尤其是msiexec)不幸需要$boostPath值,请使用此变通方法—为简洁起见,省略了一个参数:
警告:如果PowerShell中断了对传递给外部程序的参数的重新排序,请参阅,如果该问题得到修复,请参阅,此解决方法将中断
[1] 只有在Windows上,控制台程序才需要自己将整个命令行解析为单个参数;在类似Unix的平台上,他们会明智地收到一系列逐字标记。在注释中提供了关键指针:
PowerShell将-DBOOST_ROOT=$boostPath这样的标记解析为文字-无法识别$boostPath变量引用,因此无法用其值替换它
PowerShell有时会使用未引用的复合令牌表现出令人惊讶的行为,总结如下
如果$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
如果Windows[1]上的cmake确实需要。。。要使某些CLI(尤其是msiexec)不幸需要$boostPath值,请使用此变通方法—为简洁起见,省略了一个参数:
警告:如果PowerShell中断了对传递给外部程序的参数的重新排序,请参阅,如果该问题得到修复,请参阅,此解决方法将中断
[1] 只有在Windows上,控制台程序才需要自己将整个命令行解析为单个参数;在类似Unix的平台上,它们会明智地接收一系列逐字标记。PowerShell解析器将整个字符串-DBOOST_ROOT=$boostPath解释为开关参数。使用-DBOOST_ROOT=$boostPath,它应该可以工作。PowerShell解析器将整个字符串-DBOOST_ROOT=$boostPath解释为一个开关参数。使用-DBOOST_ROOT=$boostPath,它应该可以工作
cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT="D:/lib/boost/1.62.0-vs2013-x64"
cmake -S $cmakeRootPath -B $buildPath -G $cmakeGenerator -DBOOST_ROOT="$boostPath"
cmake -S $cmakeRootPath -B $buildPath -DBOOST_ROOT="`"$boostPath`""