É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?

Valentin Vasilyev
la source
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
Jouni Heikniemi
la source
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

Shay Levy
la source
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.

Xavier Chorin
la source
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.

Richard Berg
la source
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"

Josh
la source
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
Bill Moore
la source
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 .

Mark Rushakoff
la source
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).

oleschri
la source
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).

mvanle
la source
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

Terminal Bash
la source
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 :-)

Bill Naylor
la source
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

Marcelo Finki
la source