(我多么想念它),我可以检测函数的调用上下文,特别是告诉函数的返回值是被丢弃(void context)还是分配给标量或列表变量。
这允许一些非常优雅的表达。在Powershell中是否存在等价物(我没有找到一个)?
答案 0 :(得分:2)
您可以使用$ host.runspace.runningpipelines(或$ host.runspace.GetCurrentlyRunningPipeline())来访问“本地管道”。本地管道有一个“命令”成员。此数组中的每个条目(类型为Management.Automation.Runspaces.Command)表示作为正在运行的管道的一部分的命令/脚本。 Runspaces.Command有一个成员CommandText,它具有正在运行的管道的全文(而$ myinvocation只有当前行)。您可以解析CommandText,例如out-null,[void] cast和赋值给$ null。请注意,powershell解析器在一些博客中有记录,可用于帮助解析。
runningpipelines和GetCurrentlyRunningPipeline()都是RunSpace的私有成员,因此您需要通过反射访问它们。
答案 1 :(得分:0)
通常,PowerShell优先于隐式的,依赖于上下文的行为。例如:
-Verbose
参数或$VerbosePreference
变量进行配置。Format-___
次呼叫的特定成员。Rename-Item
更新的文件,但您可以使用-PassThru
参数将它们输出到管道。$x = Get-ChildItem
)中,如果没有返回任何项,则默认为null;如果只返回一个项,则默认为null;如果返回多个项,则默认为数组;但是这可以通过明确要求带有$x = @(Get-ChildItem)
的数组来覆盖。您可能认为$renamedItems = Rename-Item ...
或Rename-Item ... | Out-Default
有时可能比$renamedItems = Rename-Item ... -PassThru
更方便。但是,要解释为什么项目在第一次调用中神奇地出现在$renamedItems
中,当Rename-Item
本身没有产生任何东西时,就更难解释。 (或者更糟糕的是,如果$variable = Some-Command
恰好根据分配给$variable
的最后一个值是标量还是可枚举值来更改一个项目或多个项目之间的输出。“
话虽如此,您可以从$MyInvocation
自动变量中收集大量信息。例如,您可以检查PipelinePosition
和PipelineLength
属性,以确定调用是否是较大管道的一部分,或使用Line
和OffsetInLine
属性(可能与一些parsing logic)来确定是否存在调用输出的赋值或强制转换。
用户是否会发现结果一致且可预测是另一回事:)