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?

Walentyna Wasiljewa
źródło
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
Jouni Heikniemi
źródło
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

Shay Levy
źródło
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.

Xavier Chorin
źródło
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.

Richard Berg
źródło
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"

Josh
źródło
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
Bill Moore
źródło
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.

Mark Rushakoff
źródło
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).

oleschri
źródło
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).

mvanle
źródło
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

Terminal Bash
źródło
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 :-)

Bill Naylor
źródł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

Marcelo Finki
źródło