PowerShell:上次执行结果是否有自动变量?

KFL*_*KFL 30 powershell

我正在寻找一个与Python交互式shell的"_"变量相当的功能.在PowerShell中我想要这样的东西:

> Get-Something # this returns an object and display it to the output.
# Now I want to assign that object to some variable
> $anObj = ???
Run Code Online (Sandbox Code Playgroud)

man*_*lds 18

不,没有那样的自动变量.

你必须做:

$output = Get-Something
$output
$anObj = $output
Run Code Online (Sandbox Code Playgroud)

得到这个行为

  • 这是我第一次对PowerShell感到失望.通常情况下,总有办法做任何我梦寐以求的事情. (7认同)
  • @masterxilo因为始终保留内存中最后一组对象会产生大量的内存开销。如果最后一个命令输出 6,000,000 个对象怎么办?请记住,PowerShell 可以通过管道流式传输对象,因此它不一定需要立即将整个集合存储在内存中才能显示它们。最好假设,如果用户实际上想要保留命令的输出,他们将花费最少的精力并将其分配给变量。 (3认同)

mkl*_*nt0 9

如前所述,对此没有内置支持,但这是一个简单但次优的PSv3 + 自定义解决方案

注意:


将以下内容添加到您的$PROFILE文件中:

# Store previous command's output in $__
$PSDefaultParameterValues['Out-Default:OutVariable'] = '__'
Run Code Online (Sandbox Code Playgroud)

变量的命名方式(例如,$__(2个下划线))由您决定,但要注意名称冲突,特别是$_在多个上下文中代表自动输入变量的自动变量。

这将捕获您交互式会话中变量中最近执行的命令(产生终端输出)的终端绑定输出$__Format-*通过PowerShell全局预设参数默认值的能力显式调用格式化cmdlet的命令除外 -请参见Get-Help about_Parameters_Default_Values

-OutVariable是一个通用参数,旨在收集变量中cmdlet /高级函数的输出对象,并且上面的定义将此参数隐式应用于所有Out-Default调用,每当PowerShell将某些内容输出到终端时,这些调用都会在后台调用-但是,请注意关于Format-*cmdlet的例外。

注意事项

  • 如上所述,从使用一个格式化小命令的命令输出- ,Format-CustomFormat-HexFormat-ListFormat-TableFormat-Wide-将不被捕获。

    • 人们很容易尝试修复与$PSDefaultParameterValues['Format-*:OutVariable'] = '__',但不幸的是,这将收集格式化对象(指令)而不是原始数据$__,这是不希望的。一种不令人满意的解决方法是将Format-*输出捕获到一个不同的变量中,这不仅需要您考虑需要定位的变量,而且您仍然只能看到格式化对象而不是数据,而且由于Format-*cmdlet甚至在后台都涉及到如果您未明确使用它们,则不 Format-*调用命令的输出将被捕获两次 -一次作为数据,在中$__,再次作为格式化对象,在另一个变量中。
  • 由于设计上的怪癖,即使前一个命令仅输出单个对象,$__也将 始终包含一个数组列表(类型为[System.Collections.ArrayList])。如有疑问,请使用引用单个输出对象。$__[0]

  • 小心产生非常大的输出集的命令,因为$__它将收集它们在内存中

  • $__只会捕获输出到终端的对象-就像_Python中一样;不产生输出或$null/的数组的命令将保留$null任何先前的$__值。


Sha*_*evy 6

您还可以打印命令的结果并使用 OutVariable 参数捕获输出对象,然后使用 $anObj 显示变量内容。

Get-Something -OutVariable anObj
Run Code Online (Sandbox Code Playgroud)


Bar*_*ekB 6

最后一个选项需要大部分工作,但IMO会为您提供您所要求的内容:创建将覆盖Out-Default的代理(在管道末尾始终隐式调用,如果您没有超出其他内容).

Jeffrey Snover在PowerShell Deep Dives(我认为这是第一个)中进行了演示 - 你可以在Dmitry Sotnikov博客上找到他使用的脚本(包括上面提到的默认值).您还可以观看视频以了解整个概念.