Получить аргументы последней вызванной команды в powershell? - PullRequest
9 голосов
/ 12 ноября 2010

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

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

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 ]

12 голосов
/ 12 ноября 2010

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

Справка

man about_Automatic_Variables

получает

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

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

2 голосов
/ 12 ноября 2010

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

ps> $psparser::Tokenize("dir foo", [ref]$null) | ? {
    $_.type -eq "commandargument" } | select -last 1 -expand content
foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...