PowerShell: miglioramenti della cronologia (readline)?


12

Alcune delle cose che mi piacciono in Bash e mi piacerebbe sapere come fare in PowerShell:

  1. In Bash, ho impostato lo scorrimento della cronologia in modo che scorra solo i comandi che iniziano con lo stesso prefisso della riga corrente. Se voglio vedere il mio ultimo commit (es. Per riutilizzare parte del commento) scrivo 'git' e poi .

  2. Relativamente è ovviamente la ricerca della cronologia con Ctrl+R

  3. Per trovare altre cose, scrivo:

    h | grep foo
    

    In PowerShell utilizzo:

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

    (ovviamente sono un novizio, ci deve essere un modo più breve)

  4. Cose come:

    mv file.txt{,.bak}
    

    o

    mv file.txt !#$.bak
    
  5. Spazio magico (che si espande in !$linea)

Quali sono le alternative in PowerShell?

Risposte:


2

Per (3), puoi scriverlo come una funzione nel tuo profilo (ad es. %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

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

Poi:

hh foo

Ma Powershell è meglio concepito come un linguaggio di scripting piuttosto che come una shell interattiva, perché la console sottostante è ancora cmd.exe con tutti i suoi limiti.

Quindi è F7 per la cronologia interattiva, F3 per copiare il comando precedente, F1 per copiare un singolo carattere, F2 per copiare il comando precedente fino a un determinato carattere, ecc. Ecc.


1
La console sottostante è ancora cmd? Non la pensavo così.
sinni800,

1
la console è il sottosistema della console di Windows, utilizzato anche da cmd e da qualsiasi altra applicazione console. Ha un sacco di cose strane, come flussi e modifica dei comandi e strana selezione e completamento della TAB. Powershell ISE v3 è molto buono, ma non funziona bene con le app console "legacy". I cmdlet sono fantastici nell'ISE.
Jay Bazuzi,

15

1 - È possibile utilizzare F8dalla console di Windows per scorrere i comandi che corrispondono all'inizio della riga corrente. Questa è una corrispondenza sensibile al maiuscolo / minuscolo.

2 - È possibile utilizzare #per abbinare i comandi precedenti. L'uso non #<partial match><tab>fa distinzione tra maiuscole e minuscole e corrisponderà al testo in qualsiasi posizione nei comandi precedenti.

Se hai la seguente cronologia dei comandi:

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

Digitando #prquindi tabripetutamente scorrerà tra 1, 2 e 3.

Digitando #stquindi tabripetutamente scorrerà tra 1 e 3.

L'uso di solo # corrisponderà a tutta la cronologia.

#può anche essere usato dopo aver inserito parte di un comando. Se la tua cronologia è:

'notepad'
select *

Puoi digitare Get-Process #n<tab>| #s<tab>per ottenereGet-Process 'notepad'| select *

3 - È possibile utilizzare Select-String. Creare un alias per renderlo facile da usare (PowerShell v3 ha aggiunto l'alias sls). Allora potresti farlo.

h| sls foo

4 - Puoi fare qualcosa del tipo:

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

5 - $$corrisponde all'ultimo token dell'ultimo comando, ma non conosco un modo per espanderlo in linea.


2

Dovresti dare un'occhiata al modulo PSReadline di Oisin Grehan: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

Il codice è disponibile qui: https://bitbucket.org/oising/psreadline/overview

Questo rende PowerShell effettivamente utilizzabile come CLI, dal punto di vista degli amministratori esperti * nix che occasionalmente lavorano con Windows, aggiungendo collegamenti EMACS di base per la modifica delle linee, la ricerca della cronologia ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.