2010-11-12 7 views
8

Je veux être en mesure d'obtenir la partie argument de la commande précédente. $^ semble retourner juste la commande et non les args. Get-History -count 1 renvoie la dernière commande complète, y compris la commande et les arguments. Je pourrais juste .Remplacer la première instance, mais je ne suis pas sûr si c'est correct. Le scénario est que parfois je veux faire quelque chose comme ça. Supposons que * $ sont de args à la dernière commande:Obtenir les arguments de la dernière commande invoquée dans PowerShell?

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

Toute idée comment obtenir correctement les derniers args?

MISE À JOUR: terminé ma méthode pour ce faire.

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  
} 

Maintenant, je peux faire:

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

Pour réduire la dactylographie, je l'ai fait

set-alias $* Get-LastArgs 

maintenant je dois encore faire

copy ($*) c:\windows\system32 

si quelqu'un a des idées pour faire cela mieux s'il vous plaît faites le moi savoir.

+0

+ 1 question intéressante. Si vous n'obtenez pas une réponse satisfaisante à partir de cela, envisagez de suggérer une telle fonctionnalité sur connect.microsoft.com/powershell – x0n

+0

avec PSReadLine, Alt +. arrache le dernier argument. Si vous le précedez avec un argument numérique, il l'arrache. Donc Alt + 0 Alt +. va tirer le premier argument – IttayD

Répondre

2

Il n'y a pas de moyen facile d'obtenir les derniers arguments de cette manière sans analyser l'élément d'historique lui-même, et ce n'est pas une question triviale. La raison en est que les "derniers arguments" ne sont peut-être pas ce que vous pensez qu'ils sont après avoir pris des splatings, des pipelines, des sous-expressions imbriquées, des arguments/paramètres nommés ou non dans l'équation. Dans Powerhell v2, un analyseur est disponible pour les commandes et les expressions, mais je ne suis pas sûr que vous souhaitiez utiliser cette option.

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

Pour le dernier argument (pas tous!) Dans les hôtes interactifs comme la console et il est la ISE variable automatique $$.

Aide

man about_Automatic_Variables 

obtient

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

D'autres hôtes peuvent ou non mettre en œuvre cette fonction (ainsi que la variable $^).

+0

J'ai découvert par inadvertance que moi-même qui peut être utile dans certains cas, mais je serais vraiment aimer tous les arguments! Je suppose que je vais devoir mettre une demande de fonctionnalité. – esac

+0

Bien sûr, si vous trouvez cela utile, soumettez la demande. Personnellement, je suis sceptique sur ce genre de variables, voir le lien. Mais je peux changer d'avis s'il existe des applications réellement utiles. https://connect.microsoft.com/PowerShell/feedback/details/509802/remove-automatic-variables-and –

Questions connexes