Odpowiednik polecenia „więcej” lub „mniej” w programie PowerShell?


93

Czy istnieje sposób na podzielenie danych wyjściowych na strony przez przekierowanie ich do jakiegoś polecenia „more”, które jest dostępne w powłokach linux \ unix?


Dla tych, którzy nie wiedzą mniej, kilka fajnych rzeczy na ten temat polega na tym, że możesz cofać się, używać strzałek, używać strony w górę / w dół, a nawet wyszukiwać za pomocą klawisza „/” i wyróżniać wyniki.
Constantino Cronemberger

Odpowiedzi:


68

No cóż ... Jest „więcej”, czyli mniej więcej (...) to samo, czego można się spodziewać po innych platformach. Wypróbuj następujący przykład:

dir -rec | more

1
więcej robi to dokładnie, kiedy spojrzysz na definicję funkcji za pomocą gcm więcej | wybierz Definicja | fl
Joey.

2
W rzeczywistości przekierowanie do more jest równoznaczne z przekierowaniem do „out-host -paging”, co jest niezależne od implementacji more.com. W praktyce nie ma jednak zauważalnej różnicy.
Jouni Heikniemi,

1
Ciekawy! Dla mnie gcm more zwraca dwie definicje, z których jedna jest funkcją PowerShell, która po podaniu pustego argumentu wykonuje „$ input | out-host -p”, co jest zachowaniem, które widzę na gci -rec | jeszcze. Z drugiej strony, kiedy robię gci -rec | more.com, otrzymuję normalne zachowanie more.com. Na W7 RC z zainstalowanym PS2 również wydaje mi się, że otrzymuję more.com, nawet po wpisaniu po prostu „więcej”. W systemie Vista z PS1 występuje zachowanie opisane powyżej. Opierając się na huddledmasses.org/… , czy nie sądzisz, że funkcja powinna być wykonywana również na W7? Hmm ...
Jouni Heikniemi,

1
Przepraszam, to nie było szczególnie dobrze napisane. Chodziło mi więc o to, że w Vista z PowerShell 1, potokowanie do „more” wywołuje Out-Host -p, podczas gdy na W7 z PowerShell 2 wywołuje more.com.
Jouni Heikniemi,

1
Eep, stoję poprawione. Przepraszam. Tak, rzeczywiście, w PS 1 wywołuje Out-Host -p, a nie more.com (uwaga dla siebie: zawsze czytaj całą funkcję, nawet jeśli wygląda bardzo podobnie)
Joey

103

Tak jest:

some-cmdlet | out-host -paging


Wcześniej używałem więcej i mniej, nie będąc tak przyjaznym dla użytkownika, jak sądzę, że to możliwe. Uważam, że ta odmiana jest bardziej przydatna / użyteczna niż inne. Dziękuję bardzo.
TheXenocide

W przypadku drukowania zawartości bardzo dużego pliku działało to bardzo dobrze, ponieważ polecenie cmdlet Get-Content natychmiast zaczęło potokować zawartość do polecenia cmdlet out-host.
Germán

13
Należy zauważyć, że parametr -Paging Out-Host nie jest obsługiwany w PowerShell ISE.
Martin Hollingsworth,

@BrunoBrant Nie o to chodzi. Możesz potokować wyjście do wszystkiego; lessto po prostu duża aplikacja do przeglądania tekstu, która akceptuje stdintekst. Możesz przesłać go do pliku tymczasowego i otworzyć go w nanolub vimdla EVEN MOAR POWERRRR! Nie o to chodzi. PowerShell jest podobny bash(ale lepszy, imho). lessnie ma bash; to osobny plik binarny. Więc twoja krytyka jest nieważna.
Alan McBee - MSFT

7
Skomentuj również odpowiedź: alias ohjest dla Out-Host, a parametry mogą być skracane, jeśli nie ma konfliktu, więc polecenie może byćSome-Cmdlet | oh -p
Alan McBee - MSFT

34

dir -rec | more to zła rada.

Spowoduje to, że PowerShell oceni całe polecenie przed wyprowadzeniem go na ekran, co nie jest potrzebne do czegoś takiego jak stronicowanie danych wyjściowych

W skrajnych przypadkach może to spowodować awarię systemu (np. dir 'C:\' | more)

Z drugiej strony użycie out-host -pagingspowoduje wyświetlenie informacji na ekranie, gdy są one dostępne.


2
Kiedy używasz zdalnego programu PowerShell i chcesz przesłać polecenie ze zdalnego serwera Windows przez pager, przepuszczanie out-host -paging działa zgodnie z potrzebami. Przekazywanie potoku morepodczas wykonywania polecenia zdalnego jest bezużyteczne: cały tekst jest wyświetlany od razu.
IllvilJa

5
Alias ​​dla out-host -pagingto oh -pa.
Josh,

26

W PowerShell Community Extensions posiada poręczną funkcję o nazwie „mniej”, który zapewnia bardziej kompletny Unix stylu zestaw funkcji, stosując przeniesiony kopię less.exe właściwie obsłużyć stronicowania.

Możesz go zainstalować, uruchamiając powłokę administratora i uruchamiając:

Find-Package pscx | Install-Package -Force

( forcejest aktualizacja starszych wersji)

Możesz przesłać do niego ciągi znaków lub podać nazwy plików jako parametry bezpośrednie.

type foo.txt | less
less foo.txt, bar.txt, baz.txt

Działa w oknach ConEmu i Powershell, ale niestety nie działa tak, jak można by oczekiwać w wersji 2.0 ISE.


5
Instalacja zastępuje kilka podstawowych poleceń Powershell (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard), więc powiedzenie „ forcejest uaktualnienie starszych wersji” wydaje się być trochę mylące.
TNT

po prostu instalacja dla bieżącego użytkownika bez błędów lub ostrzeżeń:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich

Dzięki za niesamowitą wskazówkę!
Rui Craveiro

8

Wolę polecenie „mniej” niż polecenie „więcej”. Za pomocą polecenia less wyniki można również przewijać wstecz zamiast tylko do przodu.

„Mniej” z Git for Windows działa dla mnie (moja ścieżka to C:\Program Files (x86)\Git\usr\less.exe. Miałem błędy w Powershell z wersją Gow „mniej”.

Przykład:

ls|less

Aby zaoszczędzić pisanie, dodałem alias "l" mniej w moim profilu Powershell:

sal l "C:\Program Files (x86)\Git\bin\less.exe"


2
Ja też. Oprócz przewijania wstecz, less pozwala mi wyszukiwać tekst w wyniku (ukośnik, potem wpisz tekst, a następnie wciśnij Enter, a potem „n”, aby przejść do następnego wyniku, „p”, aby przejść do poprzedniego wyniku). Bardzo, bardzo wygodne.
Rui Craveiro

lessTutaj kolejny fan. Ale otrzymuję ten błąd. Jakakolwiek rada? ________________________________________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, to jest oficjalna wersja programu less.exe w systemie Git. Czy wypróbowałeś mniejszą wersję Git for Windows na gitforwindows.org ?
Josh

Nie ma potrzeby używania „hosta zewnętrznego”. Używam tego: „Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe”
Constantino Cronemberger

1
Bardzo dobrym pomysłem jest również ustawienie $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", więc będzie to używane na przykład, gdy wpiszesz "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

morenie jest używany do ograniczania wyjścia, jest używany do podziału na strony danych wyjściowych i ułatwienia czytania w terminalu, jeśli cokolwiek.

Czy mówisz o używaniu headi tail? EggHeadCafe ma przykład:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

naśladować headi tail.


W przypadku dużych plików przesyłanie rurami przebiega bardzo wolno. Istnieją lepsze sposoby (wbudowane opcje) do zrobienia headi tailteraz w programie PowerShell: stackoverflow.com/a/41626586/1081043
wisbucky

2

Dodałem definicję funkcji i alias do mojego domyślnego profilu pod adresem %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

Ta funkcja jest głównie oparta na tym wpisie na blogu autorstwa Aman Dhally z dodatkową obsługą wyjątków dla naciskania Qpodczas stronicowania.

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

więc mogę to po prostu nazwać tak dir -r | morei natychmiast rozpoczyna stronicowane wyjście z powodu potoku PowerShell (w przeciwieństwie do czekania na pełne dane wyjściowe z more.com).


1

Jeśli masz zainstalowany VIM, bardzo mi się podoba dir -r | vim -R -. Niestety ma to ten sam problem more(tj. Brak przesyłania strumieniowego).


1
cat C:\Temp\test.txt

cat jest aliasem dla Get-Content - przy większych plikach otrzymasz wyjście - More - na dole terminala

Możesz także dodać -wait

cat C:\Temp\test.txt -wait 

-wait jest jak użycie tail, ale w rzeczywistości ponownie uruchamia polecenie, tylko odświeżając wyjście

cat C:\Temp\test.txt | oh –Paging

oh = Out-Host


1

Miałem dokładnie to pytanie (cóż, chciałem mniej, nie więcej) i znalazłem odpowiedź @ richard-berg działała dla mnie, będąc nowym w PowerShell (ale nie w Linuksie), znalazłem brakujących rzeczy w tej odpowiedzi (dla mnie) były: Najpierw musiałem przejść:

Find-Package pscx | Install-Package

co następnie wyświetlało monit o „zainstalowanie pakietu NuGet”. Zrobiłem to, ale potem musiałem użyć
-AllowClobberparametru na Install-Package.

potem żeby zużywać mniej, musiałem:

Set-ExecutionPolicy RemoteSigned

co wszystko działało :-)


Witamy na stronie. Nie jestem pewien, co masz na myśli, mówiąc „odpowiedź nr 24”. Te liczby są głosami (które mogą się zmieniać), a nie wyliczeniem.
mhhollomon

Ach, rozumiem ... pierwszy raz, kiedy wysłałem wiadomość o przepełnieniu stosu! Miałem na myśli odpowiedź @ richard-berg, dla mnie byłaby to akceptowana odpowiedź
Bill Naylor

Nie wiesz, dlaczego otrzymuję głos negatywny? Wydaje mi się, że (dla mnie) pomocne jest potwierdzenie, że coś zadziałało!
Bill Naylor

0

Sugestia: Umieść plik w tymczasowym / jednorazowym pliku .txt, a następnie pozwól systemowi operacyjnemu wywołać Twój ulubiony edytor, który jest powiązany z rozszerzeniem .txt.

Get-Process | Out-File temp.txt; . \ temp.txt

Uwaga: za każdym razem, gdy tego użyjesz, nadpiszesz każdy istniejący plik temp.txt. Mądrze wybierz nazwę pliku.

Powyższe to tylko podstawowa idea.
Następnym krokiem byłoby przekształcenie tego w "| more" przy użyciu aliasów lub funkcji profilu itp.

HTH, Marcelo Finkielsztein

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.