PowerShell: mejoras en el historial (readline)?

12

Algunas de las cosas que me gustan en Bash y me encantaría saber cómo hacer en PowerShell:

  1. En Bash, tengo configurado el desplazamiento del historial para que solo se desplacen los comandos que comienzan con el mismo prefijo que la línea actual. Si quiero ver mi último commit (por ejemplo, para reutilizar parte del comentario), escribo 'git' y luego .

  2. Por supuesto, está relacionada la búsqueda del historial con Ctrl+R

  3. Para encontrar otras cosas, escribo:

    h | grep foo
    

    En PowerShell uso:

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

    (obviamente soy un novato, debe haber un camino más corto)

  4. Cosas como:

    mv file.txt{,.bak}
    

    o

    mv file.txt !#$.bak
    
  5. Espacio mágico (que se expande en !$línea)

¿Cuáles son las alternativas en PowerShell?

IttayD
fuente

Respuestas:

2

Para (3), puede escribirlo como una función en su perfil (por ejemplo %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

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

Luego:

hh foo

Pero Powershell se considera mejor como un lenguaje de script que como un shell interactivo, porque la consola subyacente sigue siendo cmd.exe con todas sus limitaciones.

Entonces, es F7 para el historial interactivo, F3 para copiar el comando anterior, F1 para copiar un solo carácter, F2 para copiar el comando anterior hasta un carácter en particular, etc., etc.

njd
fuente
1
¿La consola subyacente todavía es cmd? No lo creo.
sinni800
1
la consola es el subsistema de consola de Windows, que también es utilizado por cmd y cualquier otra aplicación de consola. Tiene muchas cosas raras, como secuencias y edición de comandos y selección extraña y finalización de TAB. Powershell ISE v3 es muy bueno, pero no funciona bien con las aplicaciones de consola "heredadas". Los cmdlets son geniales en el ISE.
Jay Bazuzi
15

1 - Puede usar F8desde la consola de Windows para recorrer los comandos que coinciden con el comienzo de la línea actual. Este es un partido sensible a mayúsculas y minúsculas.

2 - Puedes usar #para unir comandos anteriores. El uso no #<partial match><tab>distingue entre mayúsculas y minúsculas y coincidirá con el texto en cualquier posición de los comandos anteriores.

Si tiene el siguiente historial de comandos:

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

Al escribir #pr, tabrepetidamente, pasará por 1, 2 y 3.

Al escribir #st, tabrepetidamente, pasará por 1 y 3.

Usar solo # coincidirá con todo el historial.

#también se puede usar después de ingresar parte de un comando. Si tu historial es:

'notepad'
select *

Puedes escribir Get-Process #n<tab>| #s<tab>para obtenerGet-Process 'notepad'| select *

3 - Puedes usar Select-String. Cree un alias para que sea fácil de usar (PowerShell v3 agregó el alias sls). Entonces podrías hacer.

h| sls foo

4 - Puedes hacer algo como:

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

5: $$coincide con el último token del último comando, pero no conozco una forma de expandirlo en línea.

Rynant
fuente
2

Debe consultar el módulo PSReadline de Oisin Grehan: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

El código está disponible aquí: https://bitbucket.org/oising/psreadline/overview

Esto hace que PowerShell sea realmente utilizable como CLI, desde el punto de vista de administradores experimentados * nix que ocasionalmente trabajan con Windows, al agregar enlaces básicos de EMACS para edición de línea, búsqueda de historial, etc.

Joe Carroll
fuente