2010-11-12 23 views
8

Quiero ser capaz de obtener la parte del argumento del comando anterior. $^ parece devolver solo el comando y no los argumentos. Get-History -count 1 devuelve el último comando completo que incluye el comando y los argumentos. Podría simplemente. Reemplazar la primera instancia, pero no estoy seguro de si es correcta.Obteniendo los argumentos del último comando invocado en powershell?

El escenario es que a veces quiero hacer algo como esto. Vamos a suponer que $ * son los argumentos a la última orden:

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

Alguna idea de cómo conseguir los últimos argumentos correctamente?

ACTUALIZACIÓN: finalizado mi método para hacer esto.

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  
} 

Ahora sólo se puede hacer:

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

Para reducir escribir, lo hice

set-alias $* Get-LastArgs 

por lo que ahora todavía tengo que hacer

copy ($*) c:\windows\system32 

si alguien tiene cualquier idea para mejorar esto, por favor avíseme.

+0

+1 pregunta interesante. Si no obtiene una respuesta satisfactoria de esto, considere la sugerencia de tal característica en connect.microsoft.com/powershell – x0n

+0

con PSReadLine, Alt +. tira el último argumento. Si lo antecesas con un argumento digital, lo tira. Entonces Alt + 0 Alt +. jalaré el primer argumento – IttayD

Respuesta

2

No hay una manera fácil de obtener los últimos argumentos de esta manera sin analizar el elemento del historial en sí, y esto no es una cuestión trivial. La razón es que los "últimos argumentos" pueden no ser lo que usted cree que son después de tomar splatting, pipelines, subexpresiones anidadas, argumentos/parámetros nombrados y no identificados en la ecuación. En powershell v2 hay un analizador disponible para tokenizar comandos y expresiones, pero no estoy seguro de que quiera ir por esa ruta.

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

Para el último argumento (no todos!) En los anfitriones interactivas como consola e ISE es la variable automática $$.

Ayuda

man about_Automatic_Variables 

obtiene

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

Otros anfitriones pueden o no implementar esta función (así como la variable $^).

+0

Inadvertidamente descubrí que yo mismo puedo ser útil en algunos casos, ¡pero realmente me encantaría todos los argumentos! Supongo que tendré que poner una solicitud de función. – esac

+0

Por supuesto, si le resulta útil, envíe la solicitud. Personalmente, soy escéptico sobre ese tipo de variables, mira el enlace. Pero puedo cambiar de opinión si realmente hay aplicaciones útiles. https://connect.microsoft.com/PowerShell/feedback/details/509802/remove-automatic-variables-and –

Cuestiones relacionadas