4
votes

Comment obtenir la commande complète de l'alias doskey dans Windows PowerShell

J'utilise Windows PowerShell et il est configuré à l'aide de macros doskey. J'ai un fichier nommé Macros.doskey.

105=code E:\static5\105
135=code E:\static5\135
static5=code E:\static5

Comment puis-je obtenir la commande correspondant au nom d'alias?

Par exemple, lorsque je tapez 105 dans PowerShell il exécutera la commande code E: \ static5 \ 105

Maintenant, je veux savoir comment obtenir la commande de l'alias nom.


5 commentaires

ce doskey / macros listera l'ensemble actuel de macros doskey. vous pouvez analyser le texte obtenu assez facilement. [ sourire ]


@Lee_Dailey qui semble prometteur. Ce serait cool si Get-Command et / ou Get-Alias ​​ pouvaient être étendus pour les lister?!


@briantist - je ne le ferais pas de cette façon. je préfère laisser les éléments intégrés inchangés. cependant, il est assez facile d'écrire un wrapper pour ceux-ci si vous le souhaitez. je ferais une fonction qui a appelé doskey avec un filtre pour correspondre à une valeur de paramètre. [ sourire ]


@Lee_Dailey, la commande doskey / macros répertorie l'ensemble complet des macros doskey. Comment puis-je afficher une seule commande?


@SanjayRaz - utilisez quelque chose comme doskey / macros | Where-Object {$ _ -match $ Var} dans une fonction personnalisée. utilisez le modèle de fonction de base de l'ISE pour le rendre vraiment facile. [ sourire ]


3 Réponses :


1
votes

Je n'ai jamais utilisé doskey avec PowerShell, je ne suis donc pas sûr de leur apparence. Ma meilleure hypothèse est que PowerShell les considère comme des commandes de type «Application», ce qui signifie généralement des exécutables externes.

Pour commencer, vérifiez ce que PowerShell voit:

function static5 {
    code.exe 'E:\static5'
}

À partir de là, vous pourriez voir juste quelques exe comme doskey.exe ou peut-être vous ' Je vais aussi voir des informations supplémentaires.

S'il est simplement répertorié comme un exécutable, je ne suis pas sûr que vous puissiez obtenir les informations de doskey.

PowerShell a ses propres versions d'alias qui auraient vous permettent de faire une découverte complète, mais les alias PowerShell ne peuvent pas prendre de paramètres, ils alias simplement une commande sur une autre.

Vous pouvez simuler la fonctionnalité doskey dans PowerShell en écrivant des fonctions à la place:

Get-Command 105 | Format-List *
# or
gcm 105 | fl *


4 commentaires

Merci pour la réponse rapide. Votre solution fonctionne lorsque j'utilise des fonctions pour simuler les fonctionnalités doskey, mais dans mon cas, PowerShell me donne une erreur comme celle-ci Get-Command: Le terme '105' n'est pas reconnu comme le nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme utilisable . Vérifiez l'orthographe du nom ou, si un chemin a été inclus, vérifiez que le chemin est correct et réessayez. À la ligne: 1 car: 1 + Get-Command 105 | Liste des formats *


@SanjayRaz c'est très intéressant, je ne sais pas comment la commande pourrait fonctionner dans PowerShell sans être détectable via Get-Command . Malheureusement, je ne peux pas vraiment prendre le temps maintenant de faire une configuration doskey et d'enquêter, mais peut-être que quelqu'un d'autre pourra le faire. Si possible, je recommande de passer de doskey.


doskey fait la traduction du tampon d'entrée de la console. PowerShell ne voit jamais la ligne d'origine. Cela ne fonctionne pas si la console n'est pas en mode de saisie de ligne, donc il n'est pas compatible avec PSReadline , bien que Read-Host soit affecté. i.stack.imgur.com/HpYzq.png


@briantist: Le commentaire de PetSerAl implique que vous ne pourrez jamais inspecter les macros doskey avec Get-Command , car les macros doskey , si ils sont réellement en vigueur (ils ne seront pas chargés avec PSReadLine , sauf lorsque vous utilisez Read-Host , où vous ne veux pas), développez-vous avant que PowerShell ne voie la commande déjà développée



1
votes

cela fera assez bien le travail. [ grin ] notez qu'il donne juste le texte correspondant à la macro. Je n'ai pas testé avec des macros multilignes, et je ne sais pas non plus si cela est même possible.

si vous voulez que le résultat ne soit que la macro au lieu de la ligne complète, vous pouvez ajouter un | ForEach-Object {$ _. Split ('=') [1]} pour obtenir la partie après = .

dka -Macro dwd
dwd=echo 'Doo Wa Diddy'

dka -Macro adg
# nothing at all since there was no match

dka 404
404=echo '404'

test et sortie ...

@"
404=echo '404'
666=echo '666'
dwd=echo 'Doo Wa Diddy'
"@ | Set-Content "$env:TEMP\Doskey-Macros.txt" -Force

doskey /macrofile=c:\temp\doskey-macros.txt

function DKA ($Macro)
    {
    doskey /macros |
        Where-Object {
            $_ -match $Macro
            }
    }


0 commentaires

2
votes
  • doskey est un utilitaire principalement conçu pour fonctionner avec cmd.exe , pas avec PowerShell .

    • PowerShell a de meilleures fonctionnalités intégrées, sous la forme d'alias et de fonctions, et dans Windows 10, vous devez même désactiver l'édition de ligne de commande de PowerShell pour même faire fonctionner doskey (voir ci-dessous).
  • Si vous souhaitez toujours utiliser doskey dans PowerShell, il existe deux prérequis :


  • Pour résumer les raisons de ne pas utiliser doskey dans PowerShell :

    • Il ne peut pas être utilisé avec le module PSReadLine , qui par défaut gère l'édition de ligne de commande depuis Windows 10 et fournit des fonctionnalités inestimables.

    • doskey l'expansion de macro se produit invariablement aussi lorsque les scripts sollicitent une entrée utilisateur arbitraire via Read-Host , ce qui est indésirable. p>


    Par conséquent, je vous suggère de abandonner doskey au profit des fonctions PowerShell, et de les ajouter à votre $ PROFILE fichier afin qu'ils soient disponibles à chaque session:

    • Alors que vous pouvez définir des fonctions nommées pour des nombres tels que 105 dans PowerShell, vous devrez les appeler avec & afin de lever l'ambiguïté par rapport aux nombres réels, par exemple & 105 .

    • Par conséquent, je suggère de refactoriser votre approche pour définir une fonction unique nommée, par exemple, c , qui prend un argument pour identifier le (s) fichier (s) à ouvrir:

    function c { pushd E:/static5; code $(if ($Args) { $Args } else { '.' }); popd }
    

    Vos macros doskey d'origine sont ensuite mappées sur cette fonction comme suit:

    • 105 -> c 105
    • 135 -> c 135
    • static5 -> c

    Notez que cela vous permet non seulement de passer un nom de fichier arbitraire (d'un fichier situé dans E: / static5 / ) à la fonction c , mais même multiples ; par exemple, c 105 135 ouvrirait les deux fichiers pour édition.

    Pour inspecter la définition de la fonction c plus tard, vous peut simplement appeler $ function: c ou, plus verbeusement, (Get-Command c) .Definition .


    [1 ] Comme PetSerAl le note: " doskey effectue des traductions sur le tampon d'entrée de la console. [... ]. Cela ne fonctionne pas si la console n'est pas en mode de saisie de ligne, donc il n'est pas compatible avec PSReadline , bien que Read-Host soit affecté.
    https://i.stack.imgur.com/HpYzq.png " sup>


0 commentaires