PowerShell: aprimoramentos de histórico (readline)?

12

Algumas das coisas que eu gosto no Bash e adoraria saber como fazer no PowerShell:

  1. No Bash, eu tenho a rolagem do histórico configurada para que ele role somente os comandos que começam com o mesmo prefixo da linha atual. Se eu quiser ver o meu commit mais recente (por exemplo, para reutilizar parte do comentário) escrevo 'git' e depois .

  2. Relacionado é claro a busca de história com Ctrl + R

  3. Para encontrar outras coisas, escrevo:

    h | grep foo
    

    No PowerShell, uso:

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

    (obviamente eu sou um novato, deve haver um caminho mais curto)

  4. Coisas como:

    mv file.txt{,.bak}
    

    ou

    mv file.txt !#$.bak
    
  5. Espaço mágico (que expande !$ inline)

Quais são as alternativas no PowerShell?

    
por IttayD 01.02.2010 / 05:58

3 respostas

2

Para (3), você pode escrevê-lo como uma função em seu perfil (por exemplo, %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1 ):

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

Então:

hh foo

Mas o Powershell é melhor considerado como uma linguagem de script do que como um shell interativo, porque o console subjacente ainda é o cmd.exe com todas as suas limitações.

Portanto, é F7 para o histórico interativo, F3 para copiar o comando anterior, F1 para copiar um único caractere, F2 para copiar o comando anterior até um caractere específico, etc, etc.

    
por 01.02.2010 / 19:19
14

1 - Você pode usar F8 no console do Windows para percorrer os comandos que correspondem ao início da linha atual. Esta é uma correspondência entre maiúsculas e minúsculas.

2 - Você pode usar # para corresponder aos comandos anteriores. Usar #<partial match><tab> não faz distinção entre maiúsculas e minúsculas e corresponderá ao texto em qualquer posição nos comandos anteriores.

Se você tem o seguinte histórico de comandos:

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

Digitar #pr e depois guia repetidamente irá percorrer 1, 2 e 3.

Digitar #st e depois guia repetidamente irá percorrer 1 e 3.

Usar somente # corresponderá a todo o histórico.

# também pode ser usado depois de inserir parte de um comando. Se sua história é:

'notepad'
select *

Você pode digitar Get-Process #n<tab>| #s<tab> para obter Get-Process 'notepad'| select *

3 - Você pode usar Select-String . Crie um alias para facilitar o uso (o PowerShell v3 adicionou o alias sls ). Você poderia então fazer.

h| sls foo

4 - Você pode fazer algo como:

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

5 - $$ corresponde ao último token do último comando, mas não sei como expandi-lo em linha.

    
por 20.12.2011 / 15:26
2

Você deve conferir o módulo PSReadline de Oisin Grehan: link

O código está disponível aqui: link

Isso torna o PowerShell realmente utilizável como um CLI, do ponto de vista de administradores experientes do * nix que ocasionalmente trabalham com o Windows, adicionando ligações básicas do EMACS para edição de linha, pesquisa de histórico, etc.

    
por 15.12.2012 / 12:38