2010-11-12 209 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