我得到这个错误时,我试图启动与“”命令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
有什么主意吗?
1条答案
按热度按时间2wnc66cl1#
tl;dr
&
(* 调用运算符 )和%
(ForEach-Object
cmdlet***的内置别名)之间的简单混淆。用
&
代替%
,调用运算符执行命令,如外部docker-compose
程序;但是,如果您指定了程序名 unquoted(并且它不包含 * 需要 * 引号的特殊字符,也不通过变量引用表示),那么在这种情况下甚至不需要&
:至于你试过什么:
%
是ForEach-Object
cmdlet的内置别名,其用途不是调用命令,而是(通常)对来自pipeline的多个输入进行操作。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-Help
或Get-Command
来确定%
所指的内容:这是可行的,因为**
%
是一个 * 命令 *(别名)**。在命令中,它是一个符号而不是一个基于单词的名称,这是不寻常的;另一个例外是
?
,它是Where-Object
cmdlet的内置别名(因为?
是wildcard元字符,所以实际上必须使用Get-Command ``?
或Get-Help ``?
)。其他符号 * 不是 * 命令--它们通常是 * 运算符*,使用
Get-Command
时无法发现,使用Get-Help
时也几乎无法发现(您会得到很多结果,其中大多数都不相关)。请参阅概念性about_Operators说明主题,以取得运算子的说明。
在 commands 和 operators 之间的这种可发现性差距是令人遗憾的--GitHub issue #11339建议扩展
Get-Help
以支持通过操作符符号进行查找。参见X1 E11 F1 X的讨论)。与符号相关的帮助主题和信息概述:
{ ... }
@(...)
-但请注意,@(...)
在技术上是一个 * 运算符 *,因此也包含在about_Operators
中@{ .. .}
@
而不是$
(例如,@params
)引用该哈希表或数组。'...'
和"..."
字符串及其here-string变体@'<newline>...<newline>'@
和@"<newline>...<newline>"@
#
用于到行尾注解,<# ... #>
用于块注解(可以内联使用,也可以跨多行使用)。;
* 语句分隔符 *(仅当在给定行上放置 * 多个 * 语句时才需要)。