Existe uma maneira de paginar a saída canalizando-a para algum comando 'mais', que está disponível em shells linux \ unix?
Existe uma maneira de paginar a saída canalizando-a para algum comando 'mais', que está disponível em shells linux \ unix?
Respostas:
Bom ... Tem "mais", que é mais ou menos (...) o mesmo que você esperaria de outras plataformas. Experimente o seguinte exemplo:
dir -rec | more
Sim existe:
some-cmdlet | out-host -paging
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.
ohé para Out-Hoste os parâmetros podem ser abreviados se não houver conflito, então o comando pode serSome-Cmdlet | oh -p
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.
out-host -paging funciona conforme desejado. Tubulação durante a moreexecução do comando remoto é inútil: o texto inteiro é exibido de uma vez.
out-host -pagingé oh -pa.
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.
forceé para atualizar versões anteriores" parece um um pouco enganador.
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
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"
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
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
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.
heade tailagora no PowerShell: stackoverflow.com/a/41626586/1081043
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).
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
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 :-)
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