旺旺相当于?

时间:2013-04-17 01:23:58

标签: perl powershell

在Perl中

(我多么想念它),我可以检测函数的调用上下文,特别是告诉函数的返回值是被丢弃(void context)还是分配给标量或列表变量。

这允许一些非常优雅的表达。在Powershell中是否存在等价物(我没有找到一个)?

2 个答案:

答案 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自动变量中收集大量信息。例如,您可以检查PipelinePositionPipelineLength属性,以确定调用是否是较大管道的一部分,或使用LineOffsetInLine属性(可能与一些parsing logic)来确定是否存在调用输出的赋值或强制转换。

用户是否会发现结果一致且可预测是另一回事:)