powershell - Powershell变量替换不能从命令行工作
问题描述
我有以下要从 PowerShell 运行的命令:
docker run -v C:\src\docker_certs:/root/.dotnet/https -it MyContainer:MyTag /bin/bash
当我运行它时,它运行良好。(它使用目标文件夹中的源文件夹安装卷。)
但是当我运行这个时:
docker run -v $env:DOCKER_CERTS_PATH:/root/.dotnet/https -it MyContainer:MyTag /bin/bash
卷未安装。
我运行它来检查值:
echo $env:DOCKER_CERTS_PATH
它返回:
C:\src\docker_certs
据我了解,它应该在第二个命令$env:DOCKER_CERTS_PATH
中用C:\src\docker_certs替换了值。
如何在运行命令时获取对环境变量的 PowerShell 引用以替换?
解决方案
将环境变量引用包含在{...}
:
docker run -v ${env:DOCKER_CERTS_PATH}:/root/.dotnet/https ...
或者,`
-escape:
字符。跟随 env.-var。参考:
docker run -v $env:DOCKER_CERTS_PATH`:/root/.dotnet/https ...
至于你尝试了什么:
docker run -v $env:DOCKER_CERTS_PATH:/root/.dotnet/https ...
如果您不使用{...}
显式描述变量名,PowerShell 可能对变量名的结束位置有不同的想法。
作为使用的替代方法{...}
,您可以`
-escape 不希望被视为变量名一部分的第一个字符。
请注意,在这种情况下,您的命令参数被隐式处理,就好像它被包含在 中一样"..."
,因此上述内容也适用于可扩展字符串( "..."
)。
有关如何将不带引号的标记解析为命令参数的全面讨论,请参阅此答案。
在手头的情况下,:
后面$env:DOCKER_CERTS_PATH
的不被认为是变量引用的结尾;相反,它被认为是变量名的一部分,因此 PowerShell 会查找一个环境变量 ( env:
),字面意思是DOCKER_CERTS_PATH:
(sic)。
由于不存在这样的环境变量(大概),$env:DOCKER_CERTS_PATH:
因此扩展为空字符串,并且传递给 docker 的所有内容都是/root/.dotnet/https
.
您可以验证这DOCKER_CERTS_PATH:
是一个有效的环境变量名称,如下所示:
PS> $env:DOCKER_CERTS_PATH: = 'hi'; $env:DOCKER_CERTS_PATH:
hi
相比之下,常规(shell)变量不允许包含:
,因为:
- 在没有诸如env:
- 之类的命名空间前缀的情况下,它本身被认为是命名空间前缀,这会失败,因为缺少变量名部分:
PS> $DOCKER_CERTS_PATH: = 'hi' # BREAKS, even with {...}
Variable reference is not valid. ':' was not followed by a valid variable name character. Consider using ${} to delimit the name.
变量标识符中的第一个 总是被认为是命名空间标识符的结尾,它必须引用现有的 PowerShell驱动器名称,如. 此表示法称为命名空间变量表示法,如本答案中所述。:
Get-PSDrive
推荐阅读
- php - 无法到达 https://api.sendgrid.com/v3/mail/send 端点 (?)
- java - 如何删除 Java OutOfMemoryError
- python - 当尝试使用 django 模型访问 mysql 视图时,它会引发错误
- python - Flask-Admin 中的简单多对多问题
- python - 从python中的重叠矩形中找到唯一区域
- javascript - 如何将 dragstart 处理程序添加到 Fullcalendar Draggable
- spring - 即使没有附加文件,多个文件上传的大小也是 1
- solr - 如何改进 solrconfig.xml 中的 maxCacheMB 和 maxMergeSizeMB
- javascript - 保存快速创建表单时无法在 JavaScript 代码中获取记录 GUID
- android - 如何以编程方式停止 react-native 中正在进行的视频录制?