Équivalent de la commande «plus» ou «moins» dans Powershell?


92

Existe-t-il un moyen de paginer la sortie en la dirigeant vers une commande 'more', qui est disponible dans les shells linux \ unix?


Pour ceux qui n'en savent pas moins, certaines choses intéressantes à ce sujet sont que vous pouvez revenir en arrière, utiliser des flèches, utiliser la page haut / bas et même rechercher en utilisant la touche «/» et mettre les résultats en surbrillance.
Constantino Cronemberger

Réponses:


65

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

1
more fait exactement cela, quand vous regardez la définition de la fonction avec gcm more | select Definition | fl
Joey

2
En fait, le piping vers more équivaut au piping vers "out-host -paging", qui est distinct de l'implémentation more.com. En pratique, il n'y a cependant aucune différence perceptible.
Jouni Heikniemi

1
Intéressant! Pour moi, gcm more renvoie deux définitions, l'une est une fonction PowerShell qui, lorsqu'elle est donnée un argument vide, fait "$ input | out-host -p", ce qui est le comportement que je vois sur gci -rec | plus. Par contre, quand je fais gci -rec | more.com, j'obtiens le comportement normal de more.com. Sur W7 RC avec PS2 installé, il me semble aussi obtenir more.com même en tapant juste "plus". Sur Vista avec PS1, le comportement décrit ci-dessus se produit. Basé sur huddledmasses.org/ ... , ne pensez-vous pas que la fonction devrait également être exécutée sur W7? Hmm ...
Jouni Heikniemi

1
Désolé, ce n'était pas particulièrement bien écrit. Donc, mon point était que sur Vista avec PowerShell 1, le piping à juste "plus" invoque Out-Host -p tandis que sur W7 avec PowerShell 2, il appelle more.com.
Jouni Heikniemi

1
Eep, je suis corrigé. Désolé. Oui, en effet, dans PS 1, il invoque Out-Host -p, pas more.com (note à moi-même: lisez toujours toute la fonction, même si cela semble très similaire)
Joey

102

Oui il y a:

some-cmdlet | out-host -paging


J'avais utilisé de plus en moins avant, ni être aussi convivial que je devrais penser possible. J'ai trouvé cette variante plus utile / utilisable que les autres. Merci beaucoup.
TheXenocide

Pour l'impression du contenu d'un fichier très volumineux, cela a très bien fonctionné pour moi, car l'applet de commande Get-Content a commencé immédiatement à diriger le contenu vers l'applet de commande out-host.
Germán

13
Notez que le paramètre -Paging d'Out-Host n'est pas pris en charge dans PowerShell ISE.
Martin Hollingsworth

@BrunoBrant Ce n'est pas le problème. Vous pouvez diriger la sortie vers n'importe quoi; lessest juste une grande application de visualisation de texte qui accepte stdinle texte. Vous pouvez le diriger vers un fichier temporaire et l'ouvrir dans nanoou vimpour EVEN MOAR POWERRRR! Pas le point. PowerShell est comme bash(mais mieux, à mon humble avis). lessn'est pas dedans bash; c'est un binaire séparé. Donc, votre critique n'est pas valable.
Alan McBee - MSFT

7
Aussi, commentez la réponse: l'alias ohest 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
Alan McBee - MSFT

33

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 -pagingaffichera les informations à l'écran telles qu'elles sont disponibles.


2
Lorsque vous utilisez PowerShell distant et que vous souhaitez diriger une commande sur le serveur Windows distant via un téléavertisseur, le transfert out-host -paging fonctionne comme vous le souhaitez. Le piping morelors de l'exécution de la commande à distance est inutile: le texte entier est affiché en même temps.
IllvilJa

5
L'alias pour out-host -pagingest oh -pa.
Josh

26

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 forces'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.


5
L'installation remplace plusieurs commandes de base de Powershell (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard) en disant "il forcefaut mettre à niveau les anciennes versions" semble un un peu trompeur.
TNT

juste installer pour l'utilisateur actuel sans erreurs ni avertissements utiliser:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich

Merci pour le conseil génial!
Rui Craveiro

7

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"


2
Moi aussi. Outre la pagination vers l'arrière, less me permet d'effectuer une recherche de texte sur le résultat (barre oblique, puis tapez du texte, puis appuyez sur Entrée, puis sur «n» pour le résultat suivant, «p» pour le résultat précédent). Très, très, pratique.
Rui Craveiro

Un autre lessfan 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
olisteadman

@olisteadman, Ceci est la version officielle Git de less.exe. Avez-vous essayé la version Git pour Windows gitforwindows.org de less?
Josh

Pas besoin d'utiliser "out-host". J'utilise ceci: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger

1
C'est aussi une très bonne idée de définir $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", donc il sera utilisé par exemple lorsque vous tapez "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

moren'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 headet tail? EggHeadCafe a un exemple de:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

pour émuler headettail .


La tuyauterie est extrêmement lente pour les fichiers volumineux. Il existe de meilleures façons (options intégrées) de faire headet taildans PowerShell maintenant: stackoverflow.com/a/41626586/1081043
wisbucky

2

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 Qpendant 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 | moreet 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).


1

Si vous avez installé VIM, j'apprécie énormément dir -r | vim -R -. Malheureusement, cela souffre du même problème avec more(ie. Pas de streaming).


1
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


1

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
-AllowClobberparamètre sur Install-Package.

puis pour en utiliser moins, je devais:

Set-ExecutionPolicy RemoteSigned

ce qui fonctionnait :-)


Bienvenue sur le site. Je ne sais pas ce que vous entendez par «réponse n ° 24». Ces chiffres sont des votes (qui peuvent changer) plutôt qu'une énumération.
mhhollomon

Ah, je vois ... la première fois que j'ai posté sur stack overflow! Je voulais dire la réponse de @ richard-berg, pour moi, cela aurait été la réponse acceptée
Bill Naylor

Vous ne savez pas pourquoi je reçois un vote négatif? Il me semble qu'il est utile de confirmer quand quelque chose a fonctionné!
Bill Naylor

0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.