PowerShell 中 $args 的令人困惑的评估

Posted

技术标签:

【中文标题】PowerShell 中 $args 的令人困惑的评估【英文标题】:Confusing evaluation of $args in PowerShell 【发布时间】:2010-10-01 18:55:11 【问题描述】:

根据定义,$args 变量应该包含传递给脚本函数的所有参数。但是,如果我在函数内部构建管道,则 $args 变量的计算结果为 null。有谁知道为什么?

看这个例子:

function test  1..3 | %  echo "args inside pipeline: $args"  ; echo "args outside pipeline: $args" 

这是传递参数“hello”时的输出:

PS> test hello
args inside pipeline:
args inside pipeline:
args inside pipeline:
args outside pipeline: hello

这有什么具体原因吗?我知道如何解决这个问题,但是我想知道那里的任何人是否可以解释这个原因。

【问题讨论】:

【参考方案1】:

管道使用 $input。试试这个:

function test  1..3 | %  echo "args inside pipeline: $input"  ; echo "args outside pipeline: $args" 

【讨论】:

好的,谢谢。但是我仍然会说这种行为很奇怪。根据开发人员的说法,他们努力使用最小惊喜原则来设计它;) 为了解释这里发生了什么, $args 包含命令的每个未捕获(因为没有更好的术语)参数。在您的管道示例中,您从 ForEach-Object (%) 命令中请求剩余的 $args,因为这是将在其中评估脚本块的上下文。 这种事情也会发生在 $_ 自动变量上。你需要观察它所处的环境。

以上是关于PowerShell 中 $args 的令人困惑的评估的主要内容,如果未能解决你的问题,请参考以下文章

在 powershell 中传递命令行 $args,从函数到函数

使用 RedisTemplate 执行 lua 脚本时结果令人困惑

Powershell where-object 返回码

Fortran程序中令人困惑的调试错误

查询计划中的行列令人困惑

类定义中的变量范围令人困惑