Existe-t-il un moyen de paginer la sortie en la redirigeant vers une commande "more", disponible dans les shells linux\unix?
Eh bien ... Il y a "plus", ce qui est plus ou moins (...) le même que celui que vous attendriez des autres plateformes. Essayez l'exemple suivant:
dir -rec | more
Oui il y a:
some-cmdlet | out-Host -paging
dir -rec | more
est un mauvais conseil.
Powershell évaluera l’ensemble de la commande avant de l’afficher à l’écran, ce qui n’est pas nécessaire pour la pagination des résultats.
Dans certains cas extrêmes, le système risque de tomber en panne (par exemple, dir 'C:\' | more
).
D'autre part, l'utilisation de out-Host -paging
affichera les informations à l'écran dès qu'elles seront disponibles.
Les Powershell Community Extensions ont une fonction pratique nommée 'less' qui fournit un ensemble plus complet de fonctionnalités de style Unix, utilisant une copie portée de less.exe pour gérer réellement la pagination.
Vous pouvez l'installer en lançant un shell admin et en exécutant:
Find-Package pscx | Install-Package -Force
(la force
consiste à mettre à niveau des versions plus anciennes)
Vous pouvez y diriger des chaînes ou donner des noms de fichiers comme 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, il ne fonctionne pas comme prévu dans la version 2.0 ISE.
J'ai ajouté une définition de fonction et un alias à mon profil par défaut à l'adresse %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 ajoutée pour appuyer sur 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
je peux donc simplement l'appeler comme suit: dir -r | more
et il immédiatement démarre la sortie paginée en raison du pipeline de PowerShell (au lieu d'attendre la sortie complète avec more.com).
more
n'est pas utilisé pour la sortie limit, mais pour paginer la sortie et faciliter la lecture 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
imiter head
et tail
.
Si vous avez VIM installé, j'apprécie énormément dir -r | vim -R -
. Malheureusement, ceci a le même problème avec more
(c'est-à-dire pas de streaming).
cat C:\Temp\test.txt
cat est un alias pour Get-Content - avec des fichiers plus volumineux, vous obtiendrez le "Plus" en sortie au bas du terminal
Vous pouvez aussi vous pouvez ajouter -wait
cat C:\Temp\test.txt -wait
-wait est comme utiliser tail, mais il s'agit en réalité d'exécuter à nouveau la commande en rafraîchissant la sortie
cat C:\Temp\test.txt | oh –Paging
oh = hôte sortant
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
Suggestion: placez le fichier dans un fichier .txt temporaire/jetable, puis laissez le système d'exploitation appeler votre éditeur favori, celui qui est lié à l'extension .txt.
Get-Process | Out-File temp.txt; .\temp.txt
Remarque: chaque fois que vous l'utilisez, vous écraserez tout fichier temp.txt préexistant ..__ Choisissez le nom du fichier avec précaution.
Ce qui précède n’est qu’une idée de base.
La prochaine étape serait de transformer cela en "| plus" en utilisant des alias ou des fonctions de profil, etc.
HTH, Marcelo Finkielsztein
J'avais exactement cette question (bon, je voulais moins, pas plus) et j'ai trouvé la réponse de @ richard-berg qui fonctionnait pour moi, étant nouveau pour PowerShell (mais pas pour Linux), j'ai trouvé les éléments manquants dans cette réponse (pour moi) étaient: je devais d'abord y aller:Find-Package pscx | Install-Package
qui a ensuite invité à "installer le paquet Nuget". Je l'ai fait mais j'ai ensuite dû utiliser le-AllowClobber
paramètre sur Install-Package
.
alors pour utiliser moins, je devais:Set-ExecutionPolicy RemoteSigned
qui ont tous fonctionné :-)