web-dev-qa-db-fra.com

Équivalent de la commande "plus" ou "moins" dans Powershell?

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

67
Valentin

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
51
Jouni Heikniemi

Oui il y a:

some-cmdlet | out-Host -paging

83
Shay Levy

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.

25
Xavier Chorin

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.

24
Richard Berg

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

2
oleschri

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.

2
Mark Rushakoff

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

1
mvanle
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 

1
Terminal Bash
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
1
Bill Moore

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

0
Marcelo Finki

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é :-)

0
Bill Naylor