docker 不能对空值表达式调用方法

kd3sttzy  于 2022-11-22  发布在  Docker
关注(0)|答案(1)|浏览(126)

我得到这个错误时,我试图启动与“”命令docker-compose -f localdevhelpers/docker-compose.yml -f媒体服务/docker-compose.yml的docker-compose

% : You cannot call a method on a null-valued expression.
At line:1 char:1
+ % docker-compose -f localdevhelpers/docker-compose.yml  -f mediaservi ...

+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:PSObject) [ForEach-Object], PSArgumentException
    + FullyQualifiedErrorId : InvokeMethodOnNull,Microsoft.PowerShell.Commands.ForEachObjectCommand

有什么主意吗?

2wnc66cl

2wnc66cl1#

tl;dr

  • 您的问题可以归结为**&(* 调用运算符 )和%ForEach-Object cmdlet***的内置别名)之间的简单混淆。
  • 但是,产生的错误消息令人困惑,因此值得解释-请参见下文。
  • 此外,还提供了有关如何发现PowerShell中使用的符号的含义的指导。
    &代替%,调用运算符执行命令,如外部docker-compose程序;但是,如果您指定了程序名 unquoted(并且它不包含 * 需要 * 引号的特殊字符,也不通过变量引用表示),那么在这种情况下甚至不需要&
# Note: & is optional in this case.
& docker-compose -f localdevhelpers/docker-compose.yml -f mediaservice/docker-compose.yml up

至于你试过什么

%ForEach-Object cmdlet的内置别名,其用途不是调用命令,而是(通常)对来自pipeline的多个输入进行操作。

  • - obscure -错误消息*(“无法对空值表达式调用方法”)的原因:

ForEach-Object通常与一个或多个script blocks{ ... })一起使用,以便在其上操作-例如1..3 | ForEach-Object { 1 + $_ }
但是,它也支持simplified syntax,您的调用 * 意外 * 满足了它的 * 语法 * 要求,这导致了- obscure - runtime错误:

  • 语法形式% foo bar ...ForEach-Object foo bar ...)导致foo被解释为 *.NET方法 * 得名称,bar与任何后续参数被视为要传递 * 给该方法 * 得参数.
  • 在 * 每个输入对象 * 上调用指定的方法,但在没有管道输入的情况下,* 没有 * 输入对象,因此ForEach-Object看到的是 * $null *,而不是实际的输入对象。由于无法在$null上调用方法,因此报告了您看到的错误消息。
    检查命令和操作符

您可以使用Get-HelpGet-Command来确定%所指的内容:

# `Get-Help %` or even `% -?` would print help.
PS> Get-Command %

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object

这是可行的,因为**%是一个 * 命令 *(别名)**。
在命令中,它是一个符号而不是一个基于单词的名称,这是不寻常的;另一个例外是?,它是Where-Object cmdlet的内置别名(因为?wildcard元字符,所以实际上必须使用Get-Command ``?Get-Help ``?)。

其他符号 * 不是 * 命令--它们通常是 * 运算符*,使用Get-Command时无法发现,使用Get-Help时也几乎无法发现(您会得到很多结果,其中大多数都不相关)。

请参阅概念性about_Operators说明主题,以取得运算子的说明。
commandsoperators 之间的这种可发现性差距是令人遗憾的--GitHub issue #11339建议扩展Get-Help以支持通过操作符符号进行查找。参见X1 E11 F1 X的讨论)。

与符号相关的帮助主题和信息概述

  • about_Operators文档 * 所有 * 运算符。
  • about_Script_Blocks文档脚本块及其文字形式,{ ... }
  • about_Arrays文档数组及其准文字形式@(...)-但请注意,@(...)在技术上是一个 * 运算符 *,因此也包含在about_Operators
  • about_Hash_Tables文档散列表及其文字形式,@{ .. .}
  • about_Splatting讨论了参数splatting,即通过包含哈希表或数组的变量传递一组参数(参数值)的能力,必须通过@而不是$(例如,@params)引用该哈希表或数组。
  • about_Quoting_Rules文档 * 引用 *,即'...'"..."字符串及其here-string变体@'<newline>...<newline>'@@"<newline>...<newline>"@
  • about_Special_Characters记录PowerShell的 * 转义序列 *,其语法基于PowerShell的 * 转义字符 * ```,即所谓的 * 反勾号 *
  • about_Comment_Based_Help-间接-记录PowerShell的 * 注解语法 *,#用于到行尾注解,<# ... #>用于块注解(可以内联使用,也可以跨多行使用)。
  • 上述主题中未涉及的符号是; * 语句分隔符 *(仅当在给定行上放置 * 多个 * 语句时才需要)。
  • 要查找以符号(非单词字符)开头的所有 * 命令 *,请使用以下命令:
Get-Command -Type All | Where Name -Match '^\W'

相关问题