2010-11-12 29 views
8

Tôi muốn có thể lấy phần đối số của lệnh trước đó. $^ dường như chỉ trả lại lệnh và không phải là args. Get-History -count 1 trả về lệnh đầy đủ cuối cùng bao gồm lệnh và args. Tôi có thể chỉ. Thay thế trường hợp đầu tiên, nhưng tôi không chắc chắn nếu nó là chính xác.Lấy các đối số của lệnh được gọi cuối cùng trong PowerShell?

Kịch bản đôi khi tôi muốn làm điều gì đó như thế này. Giả sử rằng $ * là args cho lệnh cuối cùng:

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

Bất kỳ ý tưởng nào làm thế nào để có được arg cuối cùng chính xác?

CẬP NHẬT: đã hoàn thành phương pháp của tôi để thực hiện việc này.

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  
} 

Bây giờ tôi chỉ có thể làm:

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

Để giảm đánh máy, tôi đã làm

set-alias $* Get-LastArgs 

vì vậy bây giờ tôi vẫn phải làm

copy ($*) c:\windows\system32 

nếu ai có bất kỳ ý tưởng nào để làm điều này tốt hơn, hãy cho tôi biết.

+0

+1 câu hỏi thú vị. nếu bạn không nhận được câu trả lời thỏa đáng trong số này, hãy xem xét đề xuất tính năng như vậy trên connect.microsoft.com/powershell – x0n

+0

với PSReadLine, Alt +. yanks đối số cuối cùng. Nếu bạn đứng trước nó với một đối số kỹ thuật số, nó yanks nó. Vì vậy, Alt + 0 Alt +. sẽ yank các đối số đầu tiên – IttayD

Trả lời

2

Không có cách nào dễ dàng để có được arg cuối cùng trong thời trang này mà không phân tích cú pháp mục lịch sử, và đây không phải là vấn đề tầm thường. Lý do là "các đối số cuối cùng" có thể không phải là những gì bạn nghĩ là sau khi bạn tách, đường ống, các biểu thức con lồng nhau, các đối số/tham số được đặt tên và không được đặt tên vào trong phương trình. Trong PowerShell v2 có một trình phân tích cú pháp có sẵn để mã hóa các lệnh và các biểu thức, nhưng tôi không chắc chắn bạn muốn đi tuyến đó.

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

Đối với đối số cuối cùng (không phải tất cả!) Trong các máy chủ tương tác như Console và ISE, đó là biến tự động $$.

Trợ giúp

man about_Automatic_Variables 

được

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

host khác có thể hoặc không thể thực hiện tính năng này (cũng như $^ biến).

+0

Tôi vô tình phát hiện ra rằng bản thân mình mà có thể hữu ích trong một số trường hợp, nhưng tôi thực sự sẽ yêu tất cả các đối số! Đoán tôi sẽ phải đưa vào một yêu cầu tính năng. – esac

+0

Tất nhiên, nếu bạn thấy điều này hữu ích, hãy gửi yêu cầu. Cá nhân, tôi hoài nghi về loại biến đó, xem liên kết. Nhưng tôi có thể thay đổi ý định nếu có những ứng dụng hữu ích thực sự. https://connect.microsoft.com/PowerShell/feedback/details/509802/remove-automatic-variables-and –

Các vấn đề liên quan