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?
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?
Odpowiedzi:
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
Tak jest:
some-cmdlet | out-host -paging
less
to po prostu duża aplikacja do przeglądania tekstu, która akceptuje stdin
tekst. Możesz przesłać go do pliku tymczasowego i otworzyć go w nano
lub vim
dla EVEN MOAR POWERRRR! Nie o to chodzi. PowerShell jest podobny bash
(ale lepszy, imho). less
nie ma bash
; to osobny plik binarny. Więc twoja krytyka jest nieważna.
oh
jest dla Out-Host
, a parametry mogą być skracane, jeśli nie ma konfliktu, więc polecenie może byćSome-Cmdlet | oh -p
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 -paging
spowoduje wyświetlenie informacji na ekranie, gdy są one dostępne.
out-host -paging
działa zgodnie z potrzebami. Przekazywanie potoku more
podczas wykonywania polecenia zdalnego jest bezużyteczne: cały tekst jest wyświetlany od razu.
out-host -paging
to oh -pa
.
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
( force
jest 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.
force
jest uaktualnienie starszych wersji” wydaje się być trochę mylące.
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
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"
less
Tutaj 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
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
more
nie 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 head
i tail
? EggHeadCafe ma przykład:
type my.txt | select-object -first 10
type my.txt | select-object -last 10
naśladować head
i tail
.
head
i tail
teraz w programie PowerShell: stackoverflow.com/a/41626586/1081043
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 Q
podczas 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 | more
i natychmiast rozpoczyna stronicowane wyjście z powodu potoku PowerShell (w przeciwieństwie do czekania na pełne dane wyjściowe z more.com).
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
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ć -AllowClobber
parametru na Install-Package
.
potem żeby zużywać mniej, musiałem:
Set-ExecutionPolicy RemoteSigned
co wszystko działało :-)
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