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?
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?
Antworten:
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
Ja da ist:
some-cmdlet | out-host -paging
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.
ohist für Out-Hostund Parameter können abgekürzt werden, wenn kein Konflikt Some-Cmdlet | oh -p
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.
out-host -paging wie gewünscht. Das Durchleiten morebeim Ausführen des Remote-Befehls ist nutzlos: Der gesamte Text wird auf einmal angezeigt.
out-host -pagingist oh -pa.
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.
forceälteren Versionen zu aktualisieren ist" scheint ein ein bisschen irreführend.
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
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"
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
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
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.
headund tailjetzt in Powershell: stackoverflow.com/a/41626586/1081043
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).
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
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 :-)
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