Получение аргументов последней вызываемой команды в powershell?

Я хочу иметь возможность получить часть аргумента предыдущей команды. $^ кажется, возвращает только команду, а не args. Get-History -count 1 возвращает последнюю полную команду, включая команду и args. Я просто могу .Замените первый экземпляр, но я не уверен, что это правильно.

сценарий заключается в том, что иногда я хочу сделать что-то подобное. Предположим, что $ * - это args к последней команде:

dir sharefilesmyfile.exe
copy $* c:windowssystem32

любые идеи, как получить последние аргументы правильно?

UPDATE: закончил мой метод для этого.

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 sharefilesmyfile.exe
copy (Get-LastArgs) c:windowssystem32

чтобы уменьшить набор текста, я сделал

set-alias $* Get-LastArgs

так что теперь я все еще должен сделать

copy ($*) c:windowssystem32

если у кого-нибудь есть идеи по улучшению этого, пожалуйста, дайте мне знать.

2 ответов


нет простого способа получить последние args таким образом без разбора самого элемента истории, и это не тривиальное дело. Причина в том, что" последние аргументы " могут быть не такими, как вы думаете, после того, как вы берете splatting, конвейеры, вложенные подвыражения, именованные и неназванные аргументы/параметры в экваторию. В powershell v2 есть анализатор, доступный для токенизации команд и выражений, но я не уверен, что вы хотите идти по этому маршруту.

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

для последнего аргумента (не все!) в интерактивных хостах, таких как Console и ISE, это автоматическая переменная $$.

помогите

man about_Automatic_Variables

получает

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

другие узлы могут или не могут реализовать эту функцию (а также $^ переменной).