Equivalente ao comando 'mais' ou 'menos' no Powershell?

92

Existe uma maneira de paginar a saída canalizando-a para algum comando 'mais', que está disponível em shells linux \ unix?

Valentin Vasilyev
fonte
Para quem não sabe menos, o bacana é que você pode voltar, usar as setas, usar page up / down e até pesquisar usando a tecla '/' e ter os resultados destacados.
Constantino Cronemberger

Respostas:

65

Bom ... Tem "mais", que é mais ou menos (...) o mesmo que você esperaria de outras plataformas. Experimente o seguinte exemplo:

dir -rec | more
Jouni Heikniemi
fonte
1
more faz exatamente isso, quando você dá uma olhada na definição da função com gcm more | select Definition | fl
Joey
2
Na verdade, piping to more é igual a piping to "out-host -paging", que é separado da implementação de more.com. Na prática, porém, não há diferença perceptível.
Jouni Heikniemi
1
Interessante! Para mim, gcm more retorna duas definições, uma é uma função PowerShell que, quando recebe um argumento vazio, faz "$ input | out-host -p", que é o comportamento que estou vendo em gci -rec | Mais. Por outro lado, quando faço gci -rec | more.com, obtenho o comportamento normal do more.com. No W7 RC com PS2 instalado, também pareço obter more.com mesmo quando digito apenas "mais". No Vista com PS1, ocorre o comportamento descrito acima. Com base em huddledmasses.org/… , você não acha que a função deve ser executada no W7 também? Hmm ...
Jouni Heikniemi
1
Desculpe, isso não foi particularmente bem escrito. Portanto, meu ponto é que no Vista com PowerShell 1, canalizar para apenas "mais" invoca Out-Host -p enquanto no W7 com PowerShell 2 invoca more.com.
Jouni Heikniemi
1
Eep, eu estou corrigido. Desculpe. Sim, de fato, no PS 1 ele invoca Out-Host -p, não more.com (nota para mim mesmo: sempre leia a função inteira, mesmo que seja muito semelhante)
Joey
102

Sim existe:

some-cmdlet | out-host -paging

Shay Levy
fonte
Eu tinha usado mais e menos antes, nenhum dos dois sendo tão amigável quanto eu poderia imaginar. Achei esta variação mais útil / utilizável do que as outras. Muito obrigado.
TheXenocide
Para imprimir o conteúdo de um arquivo muito grande, isso funcionou muito bem para mim, pois o cmdlet Get-Content começou imediatamente a canalizar o conteúdo para o cmdlet out-host.
Germán de
13
Observe que o parâmetro -Paging de Out-Host não é compatível com o PowerShell ISE.
Martin Hollingsworth,
@BrunoBrant Esse não é o ponto. Você pode canalizar a saída para qualquer coisa; lessé apenas um grande aplicativo de visualização de texto que aceita stdino texto. Você pode canalizá-lo para um arquivo temporário e abri-lo no nanoou vimpara MESMO MOAR POWERRRR! Não é o ponto. PowerShell é como bash(mas melhor, imho). lessnão está em bash; é um binário separado. Portanto, sua crítica não é válida.
Alan McBee - MSFT
7
Além disso, comente a resposta: o alias ohé para Out-Hoste os parâmetros podem ser abreviados se não houver conflito, então o comando pode serSome-Cmdlet | oh -p
Alan McBee - MSFT
33

dir -rec | more é um mau conselho.

Isso fará com que o PowerShell avalie todo o comando antes de enviá-lo para a tela, algo que não é necessário para algo como a paginação de saída

Em alguns casos extremos, pode fazer com que o sistema trave (por exemplo dir 'C:\' | more)

Por outro lado, o uso de out-host -pagingexibirá as informações na tela conforme estiverem disponíveis.

Xavier Chorin
fonte
2
Quando você usa o PowerShell remoto e deseja canalizar um comando no servidor Windows remoto por meio de um pager, a canalização out-host -paging funciona conforme desejado. Tubulação durante a moreexecução do comando remoto é inútil: o texto inteiro é exibido de uma vez.
IllvilJa
5
O alias de out-host -pagingé oh -pa.
Josh
26

As extensões da comunidade Powershell têm uma função útil chamada 'less' que fornece um conjunto de recursos estilo Unix mais completo, usando uma cópia portada de less.exe para realmente lidar com a paginação.

Você pode instalá-lo iniciando um shell de administrador e executando:

Find-Package pscx | Install-Package -Force

( forceé para atualizar versões mais antigas)

Você pode enviar strings para ele ou fornecer nomes de arquivos como parâmetros diretos.

type foo.txt | less
less foo.txt, bar.txt, baz.txt

Ele funciona nas janelas ConEmu e Powershell, mas infelizmente não funciona da maneira que você esperaria no ISE v2.0.

Richard Berg
fonte
5
A instalação substitui vários comandos básicos do Powershell (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard), portanto, dizer "isso forceé para atualizar versões anteriores" parece um um pouco enganador.
TNT
apenas instalando para o usuário atual sem erros ou avisos usar:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich
Obrigado pela dica incrível!
Rui Craveiro
7

Eu prefiro o comando "menos" ao comando "mais". Com o comando less, os resultados também podem ser paginados para trás em vez de apenas para frente.

O "menos" do Git para Windows funciona para mim (Meu caminho é C:\Program Files (x86)\Git\usr\less.exe. Tive erros no Powershell com a versão Gow de "menos".

Exemplo:

ls|less

Para economizar na digitação, adicionei o alias "l" para menos no meu perfil do Powershell:

sal l "C:\Program Files (x86)\Git\bin\less.exe"

Josh
fonte
2
Eu também. Além de retroceder, o less me permite realizar uma pesquisa de texto no resultado (barra, digite o texto, pressione enter e, em seguida, 'n' para o próximo resultado, 'p' para o resultado anterior). Muito, muito conveniente.
Rui Craveiro
Outro lessfã aqui. Mas eu recebo este erro. Algum conselho? ________________________________________PS C:\Users\oli> Get-Content tmpf | out-host 'C:\Program Files\Git\usr\bin\less.exe' Out-Host : A positional parameter cannot be found that accepts argument 'C:\Program Files\Git\usr\bin\less.exe'. At line:1 char:20 + Get-Content tmpf | out-host 'C:\Program Files\Git\usr\bin\less.exe' + CategoryInfo : InvalidArgument: (:) [Out-Host], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.OutHostCommand
olisteadman
@olisteadman, esta é a versão oficial do Git do less.exe. Você já experimentou a versão gitforwindows.org de less do Git para Windows ?
Josh
Não há necessidade de usar "out-host". Eu uso este: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger
1
Também é uma idéia muito boa definir $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", então ele será usado por exemplo quando você digitar "help"
Constantino Cronemberger
4
PS> cd C:\

PS> dir -r -ex 0 | out-Host -paging

PS> dir -file -r -ea 0 c:\Windows | Select FullName,Length,LastWriteTime | out-gridview
Bill Moore
fonte
3

morenão é usado para limitar a saída, é usado para paginar a saída e tornar mais fácil a leitura em um terminal, se houver.

Você está falando em usar heade tail? EggHeadCafe tem um exemplo de:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

para emular heade tail.

Mark Rushakoff
fonte
A tubulação é extremamente lenta para arquivos grandes. Existem maneiras melhores (opções integradas) de fazer heade tailagora no PowerShell: stackoverflow.com/a/41626586/1081043
wisbucky
2

Adicionei uma definição de função e um alias ao meu perfil padrão em %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

Esta função é baseada principalmente nesta entrada de blog de Aman Dhally com manipulação de exceção adicionada para pressionar Qdurante a paginação.

function more2
{
   param(
     [Parameter(ValueFromPipeline=$true)]
     [System.Management.Automation.PSObject]$InputObject
   )

   begin
   {
      $type = [System.Management.Automation.CommandTypes]::Cmdlet
      $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand(‘Out-Host’, $type)
      $scriptCmd = {& $wrappedCmd @PSBoundParameters -Paging }
      $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
      $steppablePipeline.Begin($PSCmdlet)
   }

   process
   {
      try
      {
         $steppablePipeline.Process($_)
      }
      catch
      {
        break;
      }
   }

   end
   {
      $steppablePipeline.End()
   }

   #.ForwardHelpTargetName Out-Host
   #.ForwardHelpCategory Cmdlet
}

New-Alias more more2

então posso apenas chamá-lo assim dir -r | moree ele imediatamente inicia a saída paginada por causa do pipeline do PowerShell (em vez de esperar pela saída completa com more.com).

Oleschri
fonte
1

Se você instalou o VIM, eu gosto muito dir -r | vim -R -. Infelizmente, isso sofre o mesmo problema com more(ou seja, sem streaming).

Mvanle
fonte
1
cat C:\Temp\test.txt

cat é um alias para Get-Content - com arquivos maiores você obterá a saída - More - na parte inferior do terminal

Você também pode adicionar -wait

cat C:\Temp\test.txt -wait 

-wait é como usar tail, mas na verdade está executando novamente o comando apenas atualizando a saída

cat C:\Temp\test.txt | oh Paging

oh = Out-Host

Terminal Bash
fonte
1

Eu tinha exatamente esta pergunta (bem, eu queria menos, não mais) e descobri que a resposta @ richard-berg funcionou para mim, sendo novo no PowerShell (mas não no Linux), achei o que estava faltando nessa resposta (para mim) foram: Eu primeiro precisava ir:

Find-Package pscx | Install-Package

que então solicitou "instalar o pacote nuget". Eu fiz isso, mas depois tive que usar o
-AllowClobberparâmetro ativado Install-Package.

então, para usar menos, eu tive que: o

Set-ExecutionPolicy RemoteSigned

que funcionou :-)

Bill Naylor
fonte
Bem vindo ao site. Não tenho certeza do que você quer dizer com "resposta nº 24". Esses números são votos (que podem mudar) em vez de enumeração.
mhhollomon
Ah, entendo ... primeira vez que postei para estouro de pilha! Eu quis dizer a resposta de @richard-berg, para mim, essa teria sido a resposta aceita
Bill Naylor,
Não tem certeza de por que recebo um voto negativo? Parece (para mim) útil confirmar quando algo funcionou!
Bill Naylor
0

Sugestão: coloque o arquivo em um arquivo .txt temporário / descartável e deixe o SO invocar seu editor favorito, aquele que está vinculado à extensão .txt.

Get-Process | Out-File temp.txt; . \ temp.txt

Nota: cada vez que você usar isso, você substituirá qualquer arquivo temp.txt preexistente. Escolha o nome do arquivo com sabedoria.

O acima é apenas uma ideia básica.
O próximo passo seria transformar isso em "| mais" usando aliases ou funções de perfil, etc.

HTH, Marcelo Finkielsztein

Marcelo Finki
fonte