¿Hay alguna forma de paginar la salida canalizándola a algún comando 'más', que está disponible en linux \ unix shells?
¿Hay alguna forma de paginar la salida canalizándola a algún comando 'más', que está disponible en linux \ unix shells?
Respuestas:
Bueno ... hay "más", que es más o menos (...) lo mismo que esperarías de otras plataformas. Prueba el siguiente ejemplo:
dir -rec | more
Sí hay:
some-cmdlet | out-host -paging
less
es solo una gran aplicación de visualización de texto que acepta stdin
el texto. ¡Puede canalizarlo a un archivo temporal y abrirlo en nano
o vim
para EVEN MOAR POWERRRR! No es la cuestión. PowerShell es como bash
(pero mejor, en mi humilde opinión). less
no está en bash
; es un binario separado. Entonces tu crítica no es válida.
oh
es para Out-Host
y los parámetros se pueden abreviar si no hay conflicto, por lo que el comando podría serSome-Cmdlet | oh -p
dir -rec | more
es un mal consejo.
Hará que powershell evalúe todo el comando antes de enviarlo a la pantalla, algo que no es necesario para algo como la paginación de salida
En algunos casos extremos, podría provocar que el sistema se bloquee (p dir 'C:\' | more
. Ej. )
Por otro lado, usando out-host -paging
mostrará información en la pantalla cuando esté disponible.
out-host -paging
funciona como se desea. La canalización more
cuando se ejecuta el comando remoto no sirve de nada: el texto completo se muestra a la vez.
out-host -paging
es oh -pa
.
Las extensiones de la comunidad de Powershell tienen una función práctica llamada 'menos' que proporciona un conjunto de características más completo al estilo Unix, utilizando una copia portada de less.exe para manejar realmente la paginación.
Puede instalarlo iniciando un shell de administración y ejecutando:
Find-Package pscx | Install-Package -Force
(los force
es para actualizar versiones anteriores)
Puede canalizar cadenas o asignar nombres de archivo como parámetros directos.
type foo.txt | less
less foo.txt, bar.txt, baz.txt
Funciona en las ventanas ConEmu y Powershell, pero desafortunadamente no funciona de la manera que esperarías con el ISE v2.0.
force
es para actualizar versiones anteriores" parece un un poco engañoso.
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Prefiero el comando "menos" sobre el comando "más". Con el comando less, los resultados también se pueden paginar hacia atrás en lugar de solo hacia adelante.
El "menos" de Git para Windows funciona para mí (Mi camino es C:\Program Files (x86)\Git\usr\less.exe
. Tuve errores en Powershell con la versión de Gow de "menos".
Ejemplo:
ls|less
Para evitar escribir, agregué el alias "l" por menos en mi perfil de Powershell:
sal l "C:\Program Files (x86)\Git\bin\less.exe"
less
fan aquí. Pero obtengo este error. ¿Algún consejo? ________________________________________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
more
no se usa para limitar la salida, se usa para paginar la salida y hacer que sea más fácil de leer en una terminal, en todo caso.
¿Estás hablando de usar head
y tail
? EggHeadCafe tiene un ejemplo de:
type my.txt | select-object -first 10
type my.txt | select-object -last 10
emular head
y tail
.
head
y tail
en powershell ahora: stackoverflow.com/a/41626586/1081043
Agregué una definición de función y un alias a mi perfil predeterminado en
%SystemRoot%\system32\windowspowershell\v1.0\profile.ps1
Esta función se basa principalmente en esta entrada de blog de Aman Dhally con manejo de excepciones agregado para presionar Q
durante la paginación.
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
así que puedo llamarlo como dir -r | more
e inmediatamente comienza la salida paginada debido a la canalización de PowerShell (en lugar de esperar la salida completa con more.com).
cat C:\Temp\test.txt
cat es un alias de Get-Content; con archivos más grandes, obtendrá el resultado - Más - en la parte inferior de la terminal
También puede agregar -wait
cat C:\Temp\test.txt -wait
-wait es como usar tail, pero en realidad está volviendo a ejecutar el comando simplemente actualizando la salida
cat C:\Temp\test.txt | oh –Paging
oh = fuera del anfitrión
Tenía exactamente esta pregunta (bueno, quería menos, no más) y encontré que la respuesta de @ richard-berg funcionó para mí, siendo nuevo en PowerShell (pero no en Linux), encontré las cosas que faltaban en esa respuesta (para mí) were: Primero necesitaba ir:
Find-Package pscx | Install-Package
que luego solicitó "instalar el paquete nuget". Hice esto pero luego tuve que usar el -AllowClobber
parámetro en Install-Package
.
luego, para usar menos, tuve que:
Set-ExecutionPolicy RemoteSigned
que todo funcionó :-)
Sugerencia: coloque el archivo en un archivo .txt temporal / desechable, luego deje que el sistema operativo invoque su editor favorito, el que está vinculado a la extensión .txt.
Obtener-Proceso | Temp.txt de archivo de salida; . \ temp.txt
Nota: cada vez que use esto, sobrescribirá cualquier archivo temp.txt preexistente. Elija sabiamente el nombre del archivo.
Lo anterior es solo una idea básica.
El siguiente paso sería transformar esto en "| más" usando alias o funciones de perfil, etc.
HTH, Marcelo Finkielsztein