2010-11-12 128 views
8

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

情景是有时我想要做这样的事情。让我们假设$ *是参数传递给最后的命令:

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

任何想法如何正确地得到最后ARGS?

更新:完成我的做法。

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 

如果任何人有任何让这个更好的想法请让我知道。

+0

+1有趣的问题。如果您没有得到满意的答案,请考虑使用PSReadLine,Alt +在connect.microsoft.com/powershell – x0n 2010-11-12 18:29:50

+0

上提供此类功能。猛拉最后一个论点。如果你在数字论证之前加上它,它就会将其拉开。所以Alt + 0 Alt +。会抽出第一个参数 – IttayD 2016-07-11 04:19:10

回答

2

没有简单的方法以这种方式得到最后的参数,而没有解析历史条目本身,这不是一件小事。原因在于,在将划线,管道,嵌套的子表达式,命名的和非正式的参数/参数放入等式之后,“最后的参数”可能不是您认为的那样。在powershell v2中有一个解析器可用于标记命令和表达式,但我不确定你想要走那条路线。

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

对于喜欢控制台和ISE在交互式主机的最后一个参数(不是全部!)是自动变量$$

帮助

man about_Automatic_Variables 

得到

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

其他主机可能会或可能不会实现此功能(还有$^变量)。

+0

我无意中发现自己在某些情况下可以有所帮助,但我真的很喜欢所有的论点!猜猜我将不得不提出功能请求。 – esac 2010-11-12 23:47:20

+0

当然,如果您觉得有用,请提交请求。就我个人而言,我对这类变量持怀疑态度,请参阅链接。但是如果有实际有用的应用程序,我可以改变主意。 https://connect.microsoft.com/PowerShell/feedback/details/509802/remove-automatic-variables-and – 2010-11-13 04:07:57