Powershell变量替换无法从命令行运行

 2021-04-09 

Powershell Variable replacement not working from command line

我有以下要从PowerShell运行的命令:

1
docker run -v C:\\src\\docker_certs:/root/.dotnet/https -it MyContainer:MyTag /bin/bash

当我运行它时,它运行完美。 (它使用目标文件夹中的源文件夹安装卷。)

但是当我运行此命令时:

1
docker run -v $env:DOCKER_CERTS_PATH:/root/.dotnet/https -it MyContainer:MyTag /bin/bash

该卷未安装。

我运行它来检查值:

1
echo $env:DOCKER_CERTS_PATH

它返回:

C:\\src\\docker_certs

据我所知,它应该在第二个命令中用C:\\\\ src \\\\ docker_certs替换$env:DOCKER_CERTS_PATH的值。

如何在运行命令时获取对要替换的环境变量的PowerShell引用?


将环境变量引用包含在{...}

1
docker run -v ${env:DOCKER_CERTS_PATH}:/root/.dotnet/https ...

或者,`-转义:字符。遵循环境变量参考:

1
docker run -v $env:DOCKER_CERTS_PATH`:/root/.dotnet/https ...

关于您尝试过的事情:

docker run -v $env:DOCKER_CERTS_PATH:/root/.dotnet/https ...

如果您不使用{...}显式地描述变量名,则PowerShell可能对变量名的结尾与您的想法有所不同。

作为使用{...}的替代方法,您可以`-转义不想被视为变量名称一部分的第一个字符。

请注意,在这种情况下,您的命令参数将被隐式处理,就像将其括在"..."中一样,因此以上内容也适用于可扩展字符串("...")。

有关如何将无引号的令牌解析为命令参数的详细讨论,请参见此答案。

在当前情况下,$env:DOCKER_CERTS_PATH之后的:不被视为变量引用的结尾;而是将其视为变量名称的一部分,以便PowerShell查找字面名称为DOCKER_CERTS_PATH:(sic)的环境变量(env:)。

由于不存在这样的环境变量(大概),因此$env:DOCKER_CERTS_PATH:扩展为空字符串,并且传递给docker的全部为/root/.dotnet/https

您可以验证DOCKER_CERTS_PATH:是有效的环境变量名称,如下所示:

1
2
PS> $env:DOCKER_CERTS_PATH: = 'hi'; $env:DOCKER_CERTS_PATH:
hi

相反,不允许使用常规(shell)变量包含:,因为:(在没有诸如env:之类的名称空间前缀的情况下)本身被视为名称空间前缀,但失败,因为然后缺少变量名部分:

1
2
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所报告。
此表示法称为名称空间变量表示法,如本答案所述。