首页 > 解决方案 > 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 引用以替换?

标签: 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


推荐阅读