2010-11-12 12 views
8

Voglio essere in grado di ottenere la porzione argomento del comando precedente. $^ sembra restituire solo il comando e non gli argomenti. Get-History -count 1 restituisce l'ultimo comando completo incluso il comando e gli argomenti. Potrei semplicemente. Sostituire la prima istanza, ma non sono sicuro che sia corretta.Ottenere gli argomenti dell'ultimo comando invocato in powershell?

Lo scenario è che a volte voglio fare qualcosa di simile. Supponiamo che $ * sono gli argomenti per l'ultimo comando:

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

Delle idee come ottenere le ultime args correttamente?

UPDATE: finito il mio metodo per fare questo.

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  
} 

ora posso solo fare:

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

Per ridurre la digitazione, ho fatto

set-alias $* Get-LastArgs 

così ora ho ancora da fare

copy ($*) c:\windows\system32 

se qualcuno ha qualsiasi idea per renderlo migliore per favore fatemelo sapere.

+0

+1 domanda interessante. se non si ottiene una risposta soddisfacente al di fuori di questo, si consiglia di suggerire tale funzionalità su connect.microsoft.com/powershell – x0n

+0

con PSReadLine, Alt +. tira l'ultimo argomento. Se lo precede con un argomento digitale, lo strappa. Quindi Alt + 0 Alt +. tirerà il primo argomento – IttayD

risposta

2

Non esiste un modo semplice per ottenere gli ultimi arg in questo modo senza analizzare l'elemento della cronologia stesso e non è cosa da poco. La ragione è che gli "ultimi argomenti" potrebbero non essere ciò che pensate di essere dopo aver preso splatting, pipeline, sottoespressioni annidate, argomenti e parametri chiamati e non salvati nell'equitazione. In powershell v2 è disponibile un parser per la tokenizzazione di comandi ed espressioni, ma non sono sicuro che tu voglia seguire questa strada.

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

Per l'ultimo argomento (non tutti!) Nei padroni di casa interattive come Console e ISE è il variabile automatica $$.

Aiuto

man about_Automatic_Variables 

ottiene

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

Altri host può o non può implementare questa funzione (così come la variabile $^).

+0

Inavvertitamente ho scoperto che me stesso può essere utile in alcuni casi, ma mi piacerebbe davvero tutti gli argomenti! Suppongo che dovrò inserire una richiesta di funzionalità. – esac

+0

Naturalmente, se lo trovi utile, invia la richiesta. Personalmente, sono scettico su questo tipo di variabili, vedi il link. Ma posso cambiare idea se ci sono effettivamente applicazioni utili. https://connect.microsoft.com/PowerShell/feedback/details/509802/remove-automatic-variables-and –

Problemi correlati