Equivalente al comando "more" o "less" in Powershell?


92

Esiste un modo per impaginare l'output indirizzandolo a un comando "more", disponibile nelle shell linux \ unix?


Per coloro che non ne sanno di meno, alcune cose interessanti è che puoi tornare indietro, usare le frecce, usare la pagina su / giù e persino cercare usando il tasto "/" e avere i risultati evidenziati.
Constantino Cronemberger

Risposte:


65

Bene ... C'è "di più", che è più o meno (...) lo stesso che ti aspetteresti da altre piattaforme. Prova il seguente esempio:

dir -rec | more

1
more fa esattamente questo, quando dai un'occhiata alla definizione della funzione con gcm more | seleziona Definition | fl
Joey

2
In realtà, piping to more è uguale a piping to "out-host -paging", che è separato dall'implementazione di more.com. In pratica, però, non c'è differenza distinguibile.
Jouni Heikniemi

1
Interessante! Per me, gcm more restituisce due definizioni, una è una funzione di PowerShell che, quando viene fornito un argomento vuoto, esegue "$ input | out-host -p", che è il comportamento che vedo su gci -rec | Di Più. D'altra parte, quando eseguo gci -rec | more.com, ottengo il comportamento normale di more.com. Su W7 RC con PS2 installato, mi sembra di ottenere more.com anche quando digito solo "more". In Vista con PS1, si verifica il comportamento descritto sopra. Basato su huddledmasses.org/… , non penseresti che la funzione dovrebbe essere eseguita anche su W7? Hmm ...
Jouni Heikniemi

1
Mi spiace, non è stato scritto particolarmente bene. Quindi il mio punto era che su Vista con PowerShell 1, il piping solo "more" richiama Out-Host -p mentre su W7 con PowerShell 2 richiama more.com.
Jouni Heikniemi

1
Eep, mi correggo. Scusate. Sì, in effetti, in PS 1 invoca Out-Host -p, non more.com (nota a me stesso: leggi sempre l'intera funzione, anche se sembra molto simile)
Joey

102

Si C'è:

some-cmdlet | out-host -paging


Avevo usato più e meno prima, né essendo così facile da usare come avrei pensato possibile. Ho trovato questa variazione più utile / utilizzabile delle altre. Grazie mille.
TheXenocide

Per la stampa del contenuto di un file molto grande, questo ha funzionato molto bene per me poiché il cmdlet Get-Content ha iniziato immediatamente a reindirizzare il contenuto al cmdlet out-host.
Germania

13
Si noti che il parametro -Paging di Out-Host non è supportato in PowerShell ISE.
Martin Hollingsworth

@BrunoBrant Non è questo il punto. Potresti reindirizzare l'output a qualsiasi cosa; lessè solo un grande visualizzatore di testo che accetta stdinil testo. Puoi collegarlo a un file temporaneo e aprirlo in nanoo vimper EVEN MOAR POWERRRR! Non è il punto. PowerShell è come bash(ma meglio, imho). lessnon è in bash; è un binario separato. Quindi la tua critica non è valida.
Alan McBee - MSFT

7
Inoltre, commenta la risposta: l'alias ohè per Out-Hoste i parametri possono essere abbreviati se non c'è conflitto, quindi il comando potrebbe essereSome-Cmdlet | oh -p
Alan McBee - MSFT

33

dir -rec | more è un cattivo consiglio.

Farà sì che powershell valuti l'intero comando prima di inviarlo allo schermo, qualcosa che non è necessario per qualcosa come l'impaginazione dell'output

In alcuni casi estremi, potrebbe causare l'arresto anomalo del sistema (ad esempio dir 'C:\' | more)

D'altra parte, utilizzando out-host -pagingprodurrà le informazioni sullo schermo non appena disponibili.


2
Quando si utilizza PowerShell remoto e si desidera inviare un comando sul server Windows remoto tramite un cercapersone, il piping out-host -paging funziona come desiderato. Il collegamento moredurante l'esecuzione del comando remoto non serve: l'intero testo viene visualizzato contemporaneamente.
IllvilJa

5
L'alias di out-host -pagingè oh -pa.
Josh

26

Le estensioni della community di Powershell hanno una comoda funzione denominata "less" che fornisce un set di funzionalità in stile Unix più completo, utilizzando una copia con port di less.exe per gestire effettivamente il paging.

Puoi installarlo avviando una shell di amministrazione ed eseguendo:

Find-Package pscx | Install-Package -Force

( forceè quello di aggiornare le versioni precedenti)

È possibile reindirizzare stringhe o fornire nomi di file come parametri diretti.

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

Funziona nelle finestre ConEmu e Powershell, ma sfortunatamente non funziona come ci si aspetterebbe con ISE v2.0.


5
L'installazione sovrascrive diversi comandi Powershell di base (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard) quindi dire " forceè quello di aggiornare le versioni precedenti" sembra un un po 'fuorviante.
TNT

solo l'installazione per l'utente corrente senza errori o avvertenze usa:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich

Grazie per il fantastico suggerimento!
Rui Craveiro

7

Preferisco il comando "less" al comando "more". Con il comando less, i risultati possono anche essere spostati indietro invece che solo avanti.

Il "less" di Git per Windows funziona per me (il mio percorso è C:\Program Files (x86)\Git\usr\less.exe. Ho avuto errori in Powershell con la versione Gow di "less".

Esempio:

ls|less

Per salvare la digitazione ho aggiunto l'alias "l" for less nel mio profilo Powershell:

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


2
Anch'io. Oltre a scorrere all'indietro, less mi consente di eseguire la ricerca di testo sul risultato (barra in avanti, quindi digitare il testo, quindi premere invio, quindi "n" per il risultato successivo, "p" per il risultato precedente). Molto, molto, conveniente.
Rui Craveiro

Un altro lessfan qui. Ma ottengo questo errore. Qualche consiglio? ________________________________________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, questa è la versione Git ufficiale di less.exe. Hai provato la versione meno di Git per Windows gitforwindows.org ?
Josh

Non è necessario utilizzare "out-host". Uso questo: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger

1
È anche un'ottima idea impostare $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", quindi verrà utilizzato ad esempio quando digiti "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

3

morenon è usato per limitare l' output, è usato per impaginare l' output e rendere più facile la lettura in un terminale, se non altro.

Stai parlando di usare head e tail? EggHeadCafe ha un esempio di:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

per emulare heade tail.


Il piping è estremamente lento per file di grandi dimensioni. Ci sono modi migliori (built-in opzioni) da fare heade tailin PowerShell ora: stackoverflow.com/a/41626586/1081043
wisbucky

2

Ho aggiunto una definizione di funzione e un alias al mio profilo predefinito su %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

Questa funzione si basa principalmente su questo post di blog di Aman Dhally con l'aggiunta della gestione delle eccezioni per la pressione Qdurante il paging.

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

quindi posso semplicemente chiamarlo like dir -r | moree inizia immediatamente l' output impaginato a causa della pipeline di PowerShell (invece di aspettare l'output completo con more.com).


1

Se hai installato VIM, mi piace moltissimo dir -r | vim -R -. Purtroppo questo soffre lo stesso problema con more(cioè senza streaming).


1
cat C:\Temp\test.txt

cat è un alias per Get-Content - con file più grandi otterrai l'output - Altro - nella parte inferiore del terminale

Puoi anche aggiungere -wait

cat C:\Temp\test.txt -wait 

-wait è come usare tail ma in realtà sta rieseguendo il comando semplicemente aggiornando l'output

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

oh = Out-Host


1

Avevo esattamente questa domanda (beh, volevo di meno, non di più) e ho trovato la risposta di @ richard-berg funzionava per me, essendo nuovo in PowerShell (ma non in Linux), ho trovato le cose che mancavano da quella risposta (per me) erano: prima dovevo andare:

Find-Package pscx | Install-Package

che poi ha richiesto "l'installazione del pacchetto nuget". L'ho fatto ma poi ho dovuto usare il
-AllowClobberparametro su Install-Package.

poi per usarne di meno ho dovuto:

Set-ExecutionPolicy RemoteSigned

e tutto ha funzionato :-)


Benvenuto nel sito. Non sono sicuro di cosa intendi per "risposta n. 24". Quei numeri sono voti (che possono cambiare) piuttosto che enumerazione.
mhhollomon

Ah, capisco ... la prima volta che ho postato in stack overflow! Intendevo la risposta di @ richard-berg, per me, sarebbe stata la risposta accettata
Bill Naylor,

Non sei sicuro del motivo per cui ottengo un voto negativo? Sembra (a me) sia utile confermare quando qualcosa ha funzionato!
Bill Naylor

0

Suggerimento: inserisci il file in un file .txt temporaneo / usa e getta, quindi lascia che il sistema operativo richiami il tuo editor preferito, quello che è collegato all'estensione .txt.

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

Nota: ogni volta che lo usi, sovrascriverai qualsiasi file temp.txt preesistente. Scegli il nome del file con saggezza.

Quanto sopra è solo un'idea di base.
Il prossimo passo sarebbe trasformare questo in "| more" usando alias o funzioni di profilo, ecc.

HTH, Marcelo Finkielsztein

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.