获取powershell中最后一个被调用命令的参数?

时间:2010-11-12 18:19:46

标签: powershell

我希望能够获得上一个命令的参数部分。 $^似乎只返回命令,而不是args。 Get-History -count 1返回包含命令和args的最后一个完整命令。我可以。更换第一个实例,但我不确定它是否正确。

情节是有时我想做这样的事情。我们假设$ *是最后一个命令的参数:

dir \\share\files\myfile.exe
copy $* c:\windows\system32

有关如何正确获取最后一个参数的任何想法吗?

更新:完成了我的方法。

function Get-LastArgs
{
    $lastHistory = (Get-History -count 1)
    $lastCommand = $lastHistory.CommandLine   
    $errors = [System.Management.Automation.PSParseError[]] @()

    [System.Management.Automation.PsParser]::Tokenize($lastCommand, [ref] $errors) | ? {$_.type -eq "commandargument"} | select -last 1 -expand content    
 }

现在我可以这样做:

dir \\share\files\myfile.exe
copy (Get-LastArgs) c:\windows\system32

为了减少打字,我做了

set-alias $* Get-LastArgs

所以现在我还是要做

copy ($*) c:\windows\system32

如果有任何想法让这更好,请告诉我。

2 个答案:

答案 0 :(得分:11)

对于像Console和ISE这样的交互式主机中的最后一个参数(不是全部!),它是自动变量$$

帮助

man about_Automatic_Variables

$$
Contains the last token in the last line received by the session.

其他主机可能会也可能不会实现此功能(以及$^变量)。

答案 1 :(得分:2)

没有简单的方法可以在不解析历史项目本身的情况下以这种方式获取最后的args,这不是一件小事。原因是,在将splatting,pipelines,嵌套子表达式,命名和未命名的参数/参数带入等式之后,“最后的参数”可能不是您认为的那样。在powershell v2中,有一个解析器可用于标记命令和表达式,但我不确定你是否想要去那条路。

ps> $psparser::Tokenize("dir foo", [ref]$null) | ? {
    $_.type -eq "commandargument" } | select -last 1 -expand content
foo