¿Equivalente del comando 'más' o 'menos' en Powershell?

93

¿Hay alguna forma de paginar la salida canalizándola a algún comando 'más', que está disponible en linux \ unix shells?

Valentin Vasilyev
fuente
Para aquellos que no saben menos, algunas cosas interesantes sobre esto es que pueden retroceder, usar flechas, usar la página arriba / abajo e incluso buscar usando la tecla '/' y tener los resultados resaltados.
Constantino Cronemberger

Respuestas:

68

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
Jouni Heikniemi
fuente
1
more hace exactamente eso, cuando echa un vistazo a la definición de la función con gcm more | seleccione Definición | fl
Joey
2
En realidad, canalizar a more es igual a canalizar a "out-host-paging", que es independiente de la implementación de more.com. Sin embargo, en la práctica no hay una diferencia apreciable.
Jouni Heikniemi
1
¡Interesante! Para mí, gcm more devuelve dos definiciones, una es una función de PowerShell que, cuando se le da un argumento vacío, hace "$ input | out-host -p", que es el comportamiento que estoy viendo en gci -rec | más. Por otro lado, cuando hago gci -rec | more.com, obtengo el comportamiento normal de more.com. En W7 RC con PS2 instalado, también parece que obtengo more.com incluso cuando escribo simplemente "más". En Vista con PS1, ocurre el comportamiento descrito anteriormente. Basado en huddledmasses.org/… , ¿no crees que la función debería ejecutarse también en W7? Hmm ...
Jouni Heikniemi
1
Lo siento, eso no estuvo particularmente bien escrito. Entonces, mi punto fue que en Vista con PowerShell 1, la canalización a solo "más" invoca Out-Host -p mientras que en W7 con PowerShell 2 invoca more.com.
Jouni Heikniemi
1
Eep, me corrijo. Lo siento. Sí, de hecho, en PS 1 invoca Out-Host -p, no more.com (nota para mí mismo: lea siempre la función completa, incluso si se ve muy similar)
Joey
103

Sí hay:

some-cmdlet | out-host -paging

Shay Levy
fuente
Había usado más y menos antes, y ninguno de los dos era tan fácil de usar como creía posible. Encontré que esta variación es más útil / utilizable que las demás. Muchas gracias.
TheXenocide
Para imprimir el contenido de un archivo muy grande, esto funcionó muy bien para mí, ya que el cmdlet Get-Content comenzó inmediatamente a canalizar el contenido al cmdlet out-host.
Germán
13
Tenga en cuenta que el parámetro -Paging de Out-Host no es compatible con PowerShell ISE.
Martin Hollingsworth
@BrunoBrant Ese no es el punto. Puede canalizar la salida a cualquier cosa; lesses solo una gran aplicación de visualización de texto que acepta stdinel texto. ¡Puede canalizarlo a un archivo temporal y abrirlo en nanoo vimpara EVEN MOAR POWERRRR! No es la cuestión. PowerShell es como bash(pero mejor, en mi humilde opinión). lessno está en bash; es un binario separado. Entonces tu crítica no es válida.
Alan McBee - MSFT
7
Además, comente la respuesta: el alias ohes para Out-Hosty los parámetros se pueden abreviar si no hay conflicto, por lo que el comando podría serSome-Cmdlet | oh -p
Alan McBee - MSFT
34

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.

Xavier Chorin
fuente
2
Cuando usa PowerShell remoto y desea canalizar un comando en el servidor de Windows remoto a través de un buscapersonas, la canalización out-host -paging funciona como se desea. La canalización morecuando se ejecuta el comando remoto no sirve de nada: el texto completo se muestra a la vez.
IllvilJa
5
El alias de out-host -paginges oh -pa.
Josh
26

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.

Richard Berg
fuente
5
La instalación anula varios comandos básicos de Powershell (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard) por lo que decir " forcees para actualizar versiones anteriores" parece un un poco engañoso.
TNT
simplemente instalando para el usuario actual sin errores o advertencias uso:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich
¡Gracias por el increíble consejo!
Rui Craveiro
8

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"

Josh
fuente
2
Yo también. Además de paginar hacia atrás, less me permite realizar una búsqueda de texto en el resultado (barra diagonal, luego escribir texto, luego presionar enter, luego 'n' para el siguiente resultado, 'p' para el resultado anterior). Muy, muy conveniente.
Rui Craveiro
Otro lessfan 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
olisteadman
@olisteadman, esta es la versión oficial de Git de less.exe. ¿Has probado la versión de Git para Windows gitforwindows.org de less?
Josh
No es necesario utilizar "out-host". Yo uso esto: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger
1
También es una muy buena idea establecer $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", por lo que se usará, por ejemplo, cuando escriba "ayuda"
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
fuente
3

moreno 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 heady tail? EggHeadCafe tiene un ejemplo de:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

emular heady tail.

Mark Rushakoff
fuente
La canalización es extremadamente lenta para archivos grandes. Hay mejores formas (opciones integradas) de hacerlo heady tailen powershell ahora: stackoverflow.com/a/41626586/1081043
wisbucky
2

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 Qdurante 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 | moree inmediatamente comienza la salida paginada debido a la canalización de PowerShell (en lugar de esperar la salida completa con more.com).

oleschri
fuente
1

Si tiene VIM instalado, lo disfruto muchísimo dir -r | vim -R -. Desafortunadamente, esto tiene el mismo problema more(es decir, sin transmisión).

mvanle
fuente
1
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

Terminal Bash
fuente
1

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
-AllowClobberparámetro en Install-Package.

luego, para usar menos, tuve que:

Set-ExecutionPolicy RemoteSigned

que todo funcionó :-)

Bill Naylor
fuente
Bienvenido al sitio. No estoy seguro de lo que quiere decir con "respuesta n. ° 24". Esos números son votos (que pueden cambiar) en lugar de enumeración.
mhhollomon
Ah, ya veo ... ¡la primera vez que publico en stack overflow! Quise decir la respuesta de @ richard-berg, para mí, esa habría sido la respuesta aceptada
Bill Naylor
¿No estás seguro de por qué obtengo un voto negativo? ¡Me parece (a mí) que es útil confirmar cuando algo ha funcionado!
Bill Naylor
0

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

Marcelo Finki
fuente