Entspricht dem Befehl "mehr" oder "weniger" in Powershell?

91

Gibt es eine Möglichkeit, die Ausgabe zu paginieren, indem Sie sie an einen 'more'-Befehl weiterleiten, der in Linux \ unix-Shells verfügbar ist?

Valentin Vasilyev
quelle
Für diejenigen, die nicht weniger wissen, sind einige coole Dinge, dass Sie rückwärts gehen, Pfeile verwenden, Seite auf / ab verwenden und sogar mit der Taste '/' suchen und die Ergebnisse hervorheben können.
Constantino Cronemberger

Antworten:

64

Nun ... Es gibt "mehr", was mehr oder weniger (...) dem entspricht, was Sie von anderen Plattformen erwarten würden. Versuchen Sie das folgende Beispiel:

dir -rec | more
Jouni Heikniemi
quelle
1
more macht genau das, wenn Sie sich die Definition der Funktion mit gcm ansehen. more | select Definition | fl
Joey
2
Tatsächlich ist das Weiterleiten an mehr gleichbedeutend mit dem Weiterleiten an "Out-Host-Paging", das von der more.com-Implementierung getrennt ist. In der Praxis ist jedoch kein Unterschied erkennbar.
Jouni Heikniemi
1
Interessant! Für mich gibt gcm more zwei Definitionen zurück. Eine ist eine PowerShell-Funktion, die bei einem leeren Argument "$ input | out-host -p" ausführt. Dies ist das Verhalten, das ich bei gci -rec | sehe Mehr. Auf der anderen Seite, wenn ich gci -rec | mache more.com, ich bekomme das normale more.com-Verhalten. Auf W7 RC mit installierter PS2 bekomme ich anscheinend auch more.com, selbst wenn ich nur "more" tippe. Unter Vista mit PS1 tritt das oben beschriebene Verhalten auf. Würden Sie nicht denken, dass die Funktion basierend auf huddledmasses.org/… auch auf W7 ausgeführt werden sollte? Hmm ...
Jouni Heikniemi
1
Entschuldigung, das war nicht besonders gut geschrieben. Mein Punkt war also, dass unter Vista mit PowerShell 1 das Piping auf "mehr" Out-Host -p aufruft, während unter W7 mit PowerShell 2 more.com aufgerufen wird.
Jouni Heikniemi
1
Eep, ich stehe korrigiert. Es tut uns leid. Ja, in PS 1 wird Out-Host -p aufgerufen, nicht more.com (Hinweis für sich selbst: Lesen Sie immer die gesamte Funktion, auch wenn sie sehr ähnlich aussieht)
Joey
102

Ja da ist:

some-cmdlet | out-host -paging

Shay Levy
quelle
Ich hatte vorher immer mehr verwendet und war auch nicht so benutzerfreundlich, wie ich es für möglich halten sollte. Ich fand diese Variante nützlicher / brauchbarer als die anderen. Vielen Dank.
TheXenocide
Das Drucken des Inhalts einer sehr großen Datei hat für mich sehr gut funktioniert, da das Cmdlet Get-Content sofort gestartet wurde, um den Inhalt an das Cmdlet out-host weiterzuleiten.
Germán
13
Beachten Sie, dass der Parameter -Paging von Out-Host in der PowerShell ISE nicht unterstützt wird.
Martin Hollingsworth
@BrunoBrant Das ist nicht der Punkt. Sie können die Ausgabe an alles weiterleiten. lessist nur eine große Text-Viewer-Anwendung, die stdinden Text akzeptiert . Sie können es in eine temporäre Datei leiten und in nanooder vimfür EVEN MOAR POWERRRR öffnen! Nicht der Punkt. PowerShell ist wie bash(aber besser, imho). lessist nicht in bash; Es ist eine separate Binärdatei. Ihre Kritik ist also nicht gültig.
Alan McBee - MSFT
7
Kommentieren Sie auch die Antwort: Der Alias ohist für Out-Hostund Parameter können abgekürzt werden, wenn kein Konflikt Some-Cmdlet | oh -p
vorliegt.
33

dir -rec | more ist ein schlechter Rat.

Dadurch wird Powershell veranlasst, den gesamten Befehl auszuwerten, bevor er auf dem Bildschirm ausgegeben wird. Dies wird für die Ausgabe-Paginierung nicht benötigt

In einigen extremen Fällen könnte es das System zum Absturz bringen (zB dir 'C:\' | more)

Wenn Sie dagegen verwenden, out-host -pagingwerden Informationen auf dem Bildschirm ausgegeben, sobald sie verfügbar sind.

Xavier Chorin
quelle
2
Wenn Sie Remote-Powershell verwenden und einen Befehl auf dem Windows-Remote-Server über einen Pager weiterleiten möchten, funktioniert das Weiterleiten out-host -paging wie gewünscht. Das Durchleiten morebeim Ausführen des Remote-Befehls ist nutzlos: Der gesamte Text wird auf einmal angezeigt.
IllvilJa
5
Der Alias ​​für out-host -pagingist oh -pa.
Josh
26

Die Powershell Community Extensions verfügen über eine praktische Funktion namens "less", die einen umfassenderen Funktionsumfang im Unix-Stil bietet und eine portierte Kopie von less.exe verwendet, um das Paging tatsächlich zu verarbeiten.

Sie können es installieren, indem Sie eine Admin-Shell starten und Folgendes ausführen :

Find-Package pscx | Install-Package -Force

(das forceist, ältere Versionen zu aktualisieren)

Sie können Zeichenfolgen an diese weiterleiten oder Dateinamen als direkte Parameter angeben.

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

Es funktioniert in ConEmu- und Powershell-Fenstern, aber leider nicht so, wie Sie es unter der ISE v2.0 erwarten würden.

Richard Berg
quelle
5
Die Installation mehrere grundlegende Powershell - Befehle überschreibt (GCB, Expand-Archiv, Format-Hex, Get-Hash, Hilfe, prompt, Get-Zwischenablage, Get-Help, Set-Zwischenablage) so zu sagen "die forceälteren Versionen zu aktualisieren ist" scheint ein ein bisschen irreführend.
TNT
Nur für aktuelle Benutzer ohne Fehler oder Warnungen installieren verwenden:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich
Danke für den tollen Tipp!
Rui Craveiro
7

Ich bevorzuge den Befehl "weniger" gegenüber dem Befehl "mehr". Mit dem Befehl less können Ergebnisse auch rückwärts anstatt nur vorwärts ausgelagert werden.

Das "less" von Git für Windows funktioniert für mich (Mein Pfad ist C:\Program Files (x86)\Git\usr\less.exe. Ich hatte Fehler in Powershell mit der Gow- Version von "less".

Beispiel:

ls|less

Um das Tippen zu sparen, habe ich in meinem Powershell-Profil den Alias ​​"l" für weniger hinzugefügt:

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

Josh
quelle
2
Ich auch. Neben dem Rückwärtsblättern kann ich mit weniger eine Textsuche für das Ergebnis durchführen (Schrägstrich vorwärts, dann Text eingeben, dann die Eingabetaste drücken, dann 'n' für das nächste Ergebnis, 'p' für das vorherige Ergebnis). Sehr, sehr bequem.
Rui Craveiro
Ein weiterer lessFan hier. Aber ich bekomme diesen Fehler. Irgendein Rat? ________________________________________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, Dies ist die offizielle Git-Version von less.exe. Haben Sie die Git für Windows gitforwindows.org- Version von weniger ausprobiert ?
Josh
Keine Notwendigkeit, "Out-Host" zu verwenden. Ich benutze dies: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger
1
Es ist auch eine sehr gute Idee, $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe" festzulegen, damit es beispielsweise verwendet wird, wenn Sie "help"
eingeben
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
quelle
3

morewird nicht verwendet, um die Ausgabe zu begrenzen , sondern um die Ausgabe zu paginieren und das Einlesen in einem Terminal zu erleichtern, wenn überhaupt.

Sprechen Sie über die Verwendung von headund tail? EggHeadCafe hat ein Beispiel für:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

zu emulieren headund tail.

Mark Rushakoff
quelle
Das Piping ist bei großen Dateien extrem langsam. Es gibt bessere Möglichkeiten (integrierte Optionen) headund tailjetzt in Powershell: stackoverflow.com/a/41626586/1081043
wisbucky
2

Ich habe meinem Standardprofil unter eine Funktionsdefinition und einen Alias ​​hinzugefügt %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

Diese Funktion basiert hauptsächlich auf diesem Blogeintrag von Aman Dhally mit zusätzlicher Ausnahmebehandlung für das Drücken Qwährend des 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

Ich kann es also einfach so nennen dir -r | moreund es startet sofort die ausgelagerte Ausgabe aufgrund der PowerShell-Pipeline (im Gegensatz zum Warten auf die vollständige Ausgabe mit more.com).

oleschri
quelle
1

Wenn Sie VIM installiert haben, genieße ich es sehr dir -r | vim -R -. Leider hat dies das gleiche Problem mit more(dh kein Streaming).

mvanle
quelle
1
cat C:\Temp\test.txt

cat ist ein Alias ​​für Get-Content. Bei größeren Dateien erhalten Sie die Ausgabe - More - unten im Terminal

Sie können auch -wait hinzufügen

cat C:\Temp\test.txt -wait 

-wait ist wie die Verwendung von tail, führt jedoch den Befehl erneut aus und aktualisiert nur die Ausgabe

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

oh = Out-Host

Terminal Bash
quelle
1

Ich hatte genau diese Frage (nun, ich wollte weniger, nicht mehr) und fand, dass die Antwort von @ richard-berg für mich funktionierte. Da ich neu in PowerShell (aber nicht in Linux) war, fand ich die Dinge, die in dieser Antwort fehlten (für mich). waren: Ich musste zuerst gehen:

Find-Package pscx | Install-Package

was dann zur "Installation des Nuget-Pakets" aufforderte. Ich habe das gemacht, musste dann aber den
-AllowClobberParameter on verwenden Install-Package.

dann musste ich um weniger zu

Set-ExecutionPolicy RemoteSigned

verbrauchen : was alles funktionierte :-)

Bill Naylor
quelle
Willkommen auf der Website. Ich bin mir nicht sicher, was du mit "Antwort Nr. 24" meinst. Diese Zahlen sind eher Stimmen (die sich ändern können) als Aufzählungen.
Mhhollomon
Ah, ich verstehe ... das erste Mal, dass ich einen Stapelüberlauf gepostet habe! Ich meinte die Antwort von @ richard-berg, für mich wäre das die akzeptierte Antwort gewesen
Bill Naylor
Nicht sicher, warum ich eine Abwertung bekomme? Scheint (für mich) ist es hilfreich zu bestätigen, wenn etwas funktioniert hat!
Bill Naylor
0

Vorschlag: Legen Sie die Datei in eine temporäre / wegwerfbare TXT-Datei und lassen Sie das Betriebssystem Ihren bevorzugten Editor aufrufen, der mit der Erweiterung .txt verknüpft ist.

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

Hinweis: Jedes Mal, wenn Sie dies verwenden, überschreiben Sie eine bereits vorhandene temp.txt-Datei. Wählen Sie den Dateinamen mit Bedacht aus.

Das Obige ist nur eine Grundidee.
Der nächste Schritt wäre, dies unter Verwendung von Aliasen oder Profilfunktionen usw. in "| more" umzuwandeln.

HTH, Marcelo Finkielsztein

Marcelo Finki
quelle