PowerShell: aprimoramentos de histórico (linha de leitura)?


12

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

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

  2. Relacionado é, obviamente, a pesquisa de histórico com Ctrl+R

  3. Para encontrar outras coisas, escrevo:

    h | grep foo
    

    No PowerShell, eu uso:

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

    (obviamente eu sou um novato, deve haver uma maneira mais curta)

  4. Coisas como:

    mv file.txt{,.bak}
    

    ou

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

Quais são as alternativas no PowerShell?

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 pensado 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.


1
O console subjacente ainda está cmd? Eu acho que não.
sinni800

1
o console é o subsistema de console do Windows, que também é usado pelo cmd e por qualquer outro aplicativo de console. Tem muitas coisas estranhas, como fluxos e edição de comandos, seleção estranha e conclusão do TAB. O Powershell ISE v3 é muito bom, mas não funciona bem com aplicativos de console "legados". Os cmdlets são ótimos no ISE.
Jay Bazuzi

15

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

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

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

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

Typing #prentão tabrepetidamente irá percorrer 1, 2 e 3.

Typing #stentão tabrepetidamente irá percorrer 1 e 3.

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

#também pode ser usado depois de inserir parte de um comando. Se o seu histórico é:

'notepad'
select *

Você pode digitar Get-Process #n<tab>| #s<tab>para obterGet-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.


2

Você deve conferir o módulo PSReadline de Oisin Grehan: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

O código está disponível aqui: https://bitbucket.org/oising/psreadline/overview

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.