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.
3 Réponses :
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 *
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
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 } }
doskey
est un utilitaire principalement conçu pour fonctionner avec cmd.exe
, pas avec PowerShell .
doskey
(voir ci-dessous). Si vous souhaitez toujours utiliser doskey
dans PowerShell, il existe deux prérequis :
Vous devez appeler toutes les définitions de macro doskey.exe
avec /exename=powershell.exe
(Windows PowerShell) ou /exename=pwsh.exe
(PowerShell Core) pour qu'ils soient utilisables depuis PowerShell.
Notez que c'est alors doskey
qui développe un nom de macro tapé par l'utilisateur, ce qui signifie que PowerShell ne voit que la commande développée et n'a donc aucune connaissance des noms de macro. Par conséquent, essayer d'inspecter les macros doskey
avec
Get-Command
ne fonctionnera pas; inspectez plutôt la sortie de doskey / macros
, comme dans réponse de Lee Dailey .
De plus, doskey
résout également les macros lors de la sollicitation d'une entrée utilisateur arbitraire via Read-Host
[1] , ce qui est indésirable.
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>
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 / ouGet-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 ]