PowerShell: améliorations de l'historique (readline)?


12

Certaines des choses que j'aime dans Bash et j'aimerais savoir comment faire dans PowerShell:

  1. Dans Bash, j'ai fait défiler l'historique pour qu'il ne fasse défiler que les commandes commençant par le même préfixe que la ligne actuelle. Si je veux voir mon dernier commit (par exemple pour réutiliser une partie du commentaire) j'écris 'git' puis .

  2. Bien sûr, la recherche d'historique avec Ctrl+R

  3. Pour trouver autre chose, j'écris:

    h | grep foo
    

    Dans PowerShell, j'utilise:

    h -c 1000 | where {$_.commandline.contains("foo")}
    

    (évidemment je suis un débutant, il doit y avoir un chemin plus court)

  4. Des choses comme:

    mv file.txt{,.bak}
    

    ou

    mv file.txt !#$.bak
    
  5. Espace magique (qui se dilate en !$ligne)

Quelles sont les alternatives dans PowerShell?

Réponses:


2

Pour (3), vous pouvez l'écrire en tant que fonction dans votre profil (par exemple %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

function hh ([string] $word) {
    Get-History -c 1000 | where {$_.commandline.contains($word)}
}

Alors:

hh foo

Mais Powershell est mieux pensé comme un langage de script que comme un shell interactif, car la console sous-jacente est toujours cmd.exe avec toutes ses limitations.

Il s'agit donc de F7 pour l'historique interactif, F3 pour copier la commande précédente, F1 pour copier un seul caractère, F2 pour copier la commande précédente jusqu'à un caractère particulier, etc., etc.


1
La console sous-jacente est toujours cmd? Je ne le pensais pas.
sinni800

1
la console est le sous-système de console Windows, qui est également utilisé par cmd et toute autre application de console. Il a beaucoup de choses étranges, comme les flux et l'édition de commandes et une sélection étrange et l'achèvement de TAB. Powershell ISE v3 est très bon, mais ne fonctionne pas bien avec les applications de console "héritées". Les applets de commande sont excellentes dans l'ISE.
Jay Bazuzi

15

1 - Vous pouvez utiliser à F8partir de la console Windows pour parcourir les commandes correspondant au début de la ligne actuelle. Il s'agit d'une correspondance sensible à la casse.

2 - Vous pouvez utiliser #pour faire correspondre les commandes précédentes. L'utilisation #<partial match><tab>n'est pas sensible à la casse et fera correspondre le texte à n'importe quelle position dans les commandes précédentes.

Si vous avez l'historique des commandes suivant:

# 1
$np = Start-Process notepad -PassThru
# 2
$np| get-process
# 3
$np| Stop-Process

Taper #prpuis à tabplusieurs reprises fera défiler 1, 2 et 3.

Taper #stensuite à tabplusieurs reprises fera défiler les étapes 1 et 3.

L'utilisation de # uniquement correspondra à toute l'histoire.

#peut également être utilisé après avoir saisi une partie d'une commande. Si votre histoire est:

'notepad'
select *

Vous pouvez taper Get-Process #n<tab>| #s<tab>pour obtenirGet-Process 'notepad'| select *

3 - Vous pouvez utiliser Select-String. Créez un alias pour le rendre facile à utiliser (PowerShell v3 a ajouté l'alias sls). Vous pourriez alors le faire.

h| sls foo

4 - Vous pouvez faire quelque chose comme:

gci *a.txt| ren -n {$_.Name + '.bak'}

5 - $$correspond au dernier jeton de la dernière commande, mais je ne connais pas de moyen de l'étendre en ligne.


2

Vous devriez consulter le module PSReadline d'Oisin Grehan: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

Le code est disponible ici: https://bitbucket.org/oising/psreadline/overview

Cela rend PowerShell réellement utilisable en tant que CLI, du point de vue des administrateurs expérimentés * nix qui travaillent occasionnellement avec Windows, en ajoutant des liaisons EMACS de base pour l'édition de ligne, la recherche d'historique, etc.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.