Existe-t-il un moyen de paginer la sortie en la dirigeant vers une commande 'more', qui est disponible dans les shells linux \ unix?
Existe-t-il un moyen de paginer la sortie en la dirigeant vers une commande 'more', qui est disponible dans les shells linux \ unix?
Réponses:
Eh bien ... Il y a "plus", qui est plus ou moins (...) le même que vous attendez des autres plateformes. Essayez l'exemple suivant:
dir -rec | more
Oui il y a:
some-cmdlet | out-host -paging
less
est juste une grande application de visualisation de texte qui accepte stdin
le texte. Vous pouvez le diriger vers un fichier temporaire et l'ouvrir dans nano
ou vim
pour EVEN MOAR POWERRRR! Pas le point. PowerShell est comme bash
(mais mieux, à mon humble avis). less
n'est pas dedans bash
; c'est un binaire séparé. Donc, votre critique n'est pas valable.
oh
est pour Out-Host
, et les paramètres peuvent être abrégés s'il n'y a pas de conflit, donc la commande pourrait êtreSome-Cmdlet | oh -p
dir -rec | more
est un mauvais conseil.
Cela obligera PowerShell à évaluer la commande entière avant de la sortir à l'écran, ce qui n'est pas nécessaire pour quelque chose comme la pagination de sortie
Dans certains cas extrêmes, cela pourrait provoquer une panne du système (par exemple dir 'C:\' | more
)
D'un autre côté, utiliser out-host -paging
affichera les informations à l'écran telles qu'elles sont disponibles.
out-host -paging
fonctionne comme vous le souhaitez. Le piping more
lors de l'exécution de la commande à distance est inutile: le texte entier est affiché en même temps.
out-host -paging
est oh -pa
.
Les extensions de communauté Powershell ont une fonction pratique nommée «less» qui fournit un ensemble de fonctionnalités de style Unix plus complet, en utilisant une copie portée de less.exe pour gérer la pagination.
Vous pouvez l'installer en démarrant un shell d'administration et en exécutant:
Find-Package pscx | Install-Package -Force
(il force
s'agit de mettre à niveau les anciennes versions)
Vous pouvez y diriger des chaînes ou donner des noms de fichiers en tant que paramètres directs.
type foo.txt | less
less foo.txt, bar.txt, baz.txt
Cela fonctionne dans les fenêtres ConEmu et Powershell, mais malheureusement cela ne fonctionne pas comme vous l'attendriez sous l'ISE v2.0.
force
faut mettre à niveau les anciennes versions" semble un un peu trompeur.
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Je préfère la commande «moins» à la commande «plus». Avec la commande less, les résultats peuvent également être paginés en arrière au lieu de simplement en avant.
Le «moins» de Git pour Windows fonctionne pour moi (mon chemin est C:\Program Files (x86)\Git\usr\less.exe
. J'ai eu des erreurs dans Powershell avec la version Gow de «moins».
Exemple:
ls|less
Pour enregistrer la saisie, j'ai ajouté l'alias "l" moins cher dans mon profil Powershell:
sal l "C:\Program Files (x86)\Git\bin\less.exe"
less
fan ici. Mais j'obtiens cette erreur. Aucun conseil? ________________________________________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
n'est pas utilisé pour limiter la sortie, il est utilisé pour paginer la sortie et la rendre plus facile à lire dans un terminal, le cas échéant.
Parlez-vous d'utiliser head
et tail
? EggHeadCafe a un exemple de:
type my.txt | select-object -first 10
type my.txt | select-object -last 10
pour émuler head
ettail
.
head
et tail
dans PowerShell maintenant: stackoverflow.com/a/41626586/1081043
J'ai ajouté une définition de fonction et un alias à mon profil par défaut à
%SystemRoot%\system32\windowspowershell\v1.0\profile.ps1
Cette fonction est principalement basée sur cette entrée de blog d'Aman Dhally avec une gestion des exceptions supplémentaire pour appuyer Q
pendant la pagination.
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
donc je peux simplement l'appeler comme dir -r | more
et il démarre immédiatement la sortie paginée à cause du pipeline de PowerShell (au lieu d'attendre la sortie complète avec more.com).
cat C:\Temp\test.txt
cat est un alias pour Get-Content - avec des fichiers plus volumineux, vous obtiendrez la sortie - Plus - en bas du terminal
Vous pouvez également ajouter -wait
cat C:\Temp\test.txt -wait
-wait est comme utiliser tail mais il réexécute la commande juste en rafraîchissant la sortie
cat C:\Temp\test.txt | oh –Paging
oh = hôte externe
J'avais exactement cette question (enfin je voulais moins, pas plus) et j'ai trouvé que la réponse de @ richard-berg a fonctionné pour moi, étant nouveau sur PowerShell (mais pas sur Linux), j'ai trouvé les choses qui manquaient à cette réponse (pour moi) étaient: je devais d'abord aller:
Find-Package pscx | Install-Package
qui a ensuite demandé "installer le paquet nuget". Je l'ai fait mais j'ai ensuite dû utiliser le -AllowClobber
paramètre sur Install-Package
.
puis pour en utiliser moins, je devais:
Set-ExecutionPolicy RemoteSigned
ce qui fonctionnait :-)
Suggestion: mettez le fichier dans un fichier .txt temporaire / jetable, puis laissez le système d'exploitation appeler votre éditeur préféré, celui qui est lié à l'extension .txt.
Get-Process | Out-File temp.txt; . \ temp.txt
Remarque: chaque fois que vous l'utiliserez, vous écraserez tout fichier temp.txt préexistant. Choisissez judicieusement le nom du fichier.
Ce qui précède n'est qu'une idée de base.
La prochaine étape consisterait à transformer cela en "| plus" en utilisant des alias ou des fonctions de profil, etc.
HTH, Marcelo Finkielsztein