Setara dengan perintah 'more' atau 'less' di Powershell?

93

Apakah ada cara untuk memberi nomor pada keluaran dengan menyalurkannya ke beberapa perintah 'more', yang tersedia di linux \ unix shells?

Valentin Vasilyev
sumber
Bagi mereka yang tidak tahu kurang, beberapa hal keren tentang itu adalah Anda dapat mundur, menggunakan panah, menggunakan halaman atas / bawah dan bahkan mencari menggunakan tombol '/' dan hasilnya disorot.
Constantino Cronemberger

Jawaban:

68

Nah ... Ada "lebih", yang kurang lebih (...) sama dengan yang Anda harapkan dari platform lain. Coba contoh berikut:

dir -rec | more
Jouni Heikniemi
sumber
1
more tidak persis seperti itu, ketika Anda melihat definisi fungsi dengan gcm more | pilih Definisi | fl
Joey
2
Sebenarnya, menyalurkan ke lebih banyak sama dengan menyalurkan ke "out-host -paging", yang terpisah dari implementasi more.com. Dalam prakteknya tidak ada perbedaan yang terlihat.
Jouni Heikniemi
1
Menarik! Bagi saya, gcm more mengembalikan dua definisi, satu adalah fungsi PowerShell yang, ketika diberi argumen kosong, melakukan "$ input | out-host -p", yang merupakan perilaku yang saya lihat di gci -rec | lebih. Sebaliknya, ketika saya melakukan gci -rec | more.com, saya mendapatkan perilaku more.com normal. Di W7 RC dengan PS2 terinstal, saya juga mendapatkan more.com bahkan saat mengetik "lagi". Di Vista dengan PS1, perilaku yang dijelaskan di atas terjadi. Berdasarkan huddledmasses.org/… , bukankah menurut Anda fungsi tersebut harus dijalankan di W7 juga? Hmm ...
Jouni Heikniemi
1
Maaf, itu tidak ditulis dengan baik. Jadi maksud saya adalah bahwa di Vista dengan PowerShell 1, piping ke "more" memanggil Out-Host -p sementara di W7 dengan PowerShell 2 memanggil more.com.
Jouni Heikniemi
1
Eep, saya berdiri dikoreksi. Maaf. Ya, memang, di PS 1 itu memanggil Out-Host -p, bukan more.com (catatan untuk diri sendiri: Selalu baca seluruh fungsi, meskipun terlihat sangat mirip)
Joey
103

Ya ada:

some-cmdlet | out-host -paging

Shay Levy
sumber
Saya telah menggunakan lebih banyak dan lebih sedikit sebelumnya, tidak cukup ramah pengguna seperti yang saya kira mungkin. Saya menemukan variasi ini lebih berguna / bermanfaat daripada yang lain. Terima kasih banyak.
TheXenocide
Untuk mencetak konten dari file yang sangat besar, ini bekerja sangat baik bagi saya karena cmdlet Get-Content mulai segera untuk menyalurkan konten ke cmdlet out-host.
Germán
13
Perhatikan bahwa parameter -Paging dari Out-Host tidak didukung di PowerShell ISE.
Martin Hollingsworth
@BrunoBrant Bukan itu intinya. Anda dapat menyalurkan output ke apa pun; lesshanyalah sebuah aplikasi penampil teks besar yang menerima stdinteks. Anda dapat menyalurkannya ke file temp dan membukanya di nanoatau vimuntuk EVEN MOAR POWERRRR! Bukan itu intinya. PowerShell seperti bash(tapi lebih baik, imho). lesstidak di bash; itu adalah biner terpisah. Jadi kritik Anda tidak valid.
Alan McBee - MSFT
7
Juga, komentari jawabannya: alias ohuntuk Out-Host, dan parameter dapat disingkat jika tidak ada konflik, jadi perintahnya bisa jadiSome-Cmdlet | oh -p
Alan McBee - MSFT
34

dir -rec | more adalah nasihat yang buruk.

Ini akan menyebabkan PowerShell untuk mengevaluasi seluruh perintah sebelum mengeluarkannya ke layar, sesuatu yang tidak diperlukan untuk sesuatu seperti keluaran paginasi

Dalam beberapa kasus ekstrim, ini dapat menyebabkan sistem crash (mis. dir 'C:\' | more)

Di sisi lain, menggunakan out-host -pagingakan menampilkan informasi ke layar saat tersedia.

Xavier Chorin
sumber
2
Saat Anda menggunakan PowerShell jarak jauh dan ingin menyalurkan perintah di server Windows jarak jauh melalui pager, menyalurkan melalui out-host -paging karya seperti yang diinginkan. Tidak moreada gunanya menyalurkan saat menjalankan perintah jarak jauh: seluruh teks ditampilkan sekaligus.
IllvilJa
5
Alias ​​untuk out-host -pagingadalah oh -pa.
Josh
26

The Powershell Komunitas Extensions memiliki fungsi berguna bernama 'kurang' yang menyediakan fitur set Unix-gaya yang lebih lengkap, menggunakan salinan porting dari less.exe untuk benar-benar menangani paging.

Anda dapat menginstalnya dengan memulai shell admin dan menjalankan:

Find-Package pscx | Install-Package -Force

(itu force adalah untuk meningkatkan versi yang lebih lama)

Anda dapat menyalurkan string ke sana, atau memberikan nama file sebagai parameter langsung.

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

Ini berfungsi di jendela ConEmu dan Powershell, tetapi sayangnya itu tidak berfungsi seperti yang Anda harapkan di bawah ISE v2.0.

Richard Berg
sumber
5
Instalasi menimpa beberapa perintah Powershell dasar (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard) sehingga mengatakan " forceadalah untuk mengupgrade versi yang lebih lama" tampaknya a sedikit menyesatkan.
TNT
hanya menginstal untuk pengguna saat ini tanpa kesalahan atau peringatan gunakan:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich
Terima kasih atas tipnya yang luar biasa!
Rui Craveiro
8

Saya lebih suka perintah "kurang" daripada perintah "lebih banyak". Dengan perintah less, hasil juga bisa ditampilkan ke belakang, bukan hanya ke depan.

"Kurang" dari Git untuk Windows berfungsi untuk saya (Jalur saya adalah C:\Program Files (x86)\Git\usr\less.exe. Saya mengalami kesalahan di Powershell dengan versi Gow "kurang".

Contoh:

ls|less

Untuk menghemat pengetikan, saya menambahkan alias "l" di profil Powershell saya:

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

Josh
sumber
2
Saya juga. Selain paging mundur, less memungkinkan saya untuk melakukan pencarian teks pada hasil (garis miring ke depan, lalu ketik teks, lalu tekan enter, lalu 'n' untuk hasil berikutnya, 'p' untuk hasil sebelumnya). Sangat, sangat, nyaman.
Rui Craveiro
lessPenggemar lain di sini. Tapi saya mendapatkan kesalahan ini. Ada saran? ________________________________________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, Ini adalah versi Git resmi dari less.exe. Sudahkah Anda mencoba Git untuk Windows versi gitforwindows.org yang lebih lama?
Josh
Tidak perlu menggunakan "out-host". Saya menggunakan ini: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger
1
Sebaiknya setel $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", jadi ini akan digunakan misalnya saat Anda mengetik "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
sumber
3

moretidak digunakan untuk membatasi keluaran, ini digunakan untuk memberi nomor halaman keluaran dan membuatnya lebih mudah untuk dibaca di terminal, jika ada.

Apakah Anda berbicara tentang penggunaan headdan tail? EggHeadCafe memiliki contoh:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

untuk meniru headdan tail.

Mark Rushakoff
sumber
Perpipaan sangat lambat untuk file besar. Ada cara yang lebih baik (opsi headtail
bawaan
2

Saya menambahkan definisi fungsi dan alias ke profil default saya di %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

Fungsi ini sebagian besar didasarkan pada entri blog ini oleh Aman Dhally dengan tambahan penanganan pengecualian untuk menekan Qsaat paging.

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

jadi saya bisa menyebutnya seperti dir -r | moredan segera memulai keluaran paged karena pipa PowerShell (sebagai lawan menunggu keluaran lengkap dengan more.com).

oleschri
sumber
1

Jika Anda telah menginstal VIM, saya sangat menikmati dir -r | vim -R -. Sayangnya hal ini mengalami masalah yang sama dengan more(yaitu tanpa streaming).

mvanle
sumber
1
cat C:\Temp\test.txt

cat adalah alias untuk Get-Content - dengan file yang lebih besar Anda akan mendapatkan - More - output di bagian bawah terminal

Anda juga bisa menambahkan -wait

cat C:\Temp\test.txt -wait 

-wait seperti menggunakan tail tetapi sebenarnya menjalankan kembali perintah hanya menyegarkan output

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

oh = Host Luar

Terminal Bash
sumber
1

Saya memiliki pertanyaan ini persis (baik saya ingin lebih sedikit, tidak lebih) dan menemukan jawaban dari @ richard-berg berhasil untuk saya, karena baru mengenal PowerShell (tetapi tidak ke Linux), saya menemukan hal-hal yang hilang dari jawaban itu (untuk saya) adalah: Pertama-tama saya harus pergi:

Find-Package pscx | Install-Package

yang kemudian diminta untuk "menginstal paket nuget". Saya melakukan ini tetapi kemudian harus menggunakan
-AllowClobberparameter pada Install-Package.

kemudian untuk menggunakan lebih sedikit, saya harus:

Set-ExecutionPolicy RemoteSigned

yang semuanya berfungsi :-)

Bill Naylor
sumber
Selamat datang di situs. Tidak yakin apa yang Anda maksud dengan "jawaban # 24". Angka-angka itu adalah suara (yang bisa berubah) daripada pencacahan.
mhhollomon
Ah, begitu ... pertama kali saya memposting ke stack overflow! Maksud saya jawaban dari @ richard-berg, bagi saya, itu akan menjadi jawaban yang diterima
Bill Naylor
Tidak yakin mengapa saya mendapat suara negatif? Sepertinya (bagi saya) sangat membantu untuk mengonfirmasi ketika sesuatu telah berhasil!
Bill Naylor
0

Saran: Letakkan file tersebut ke dalam file .txt sementara / sekali pakai, kemudian biarkan OS memanggil editor favorit Anda, yang ditautkan ke ekstensi .txt.

Dapatkan-Proses | Temp.txt Keluar-File; . \ temp.txt

Catatan: setiap kali Anda menggunakan ini, Anda akan menimpa file temp.txt yang sudah ada sebelumnya. Pilih nama file dengan bijak.

Di atas hanyalah ide dasar.
Langkah selanjutnya adalah mengubahnya menjadi "| more" menggunakan alias atau fungsi profil, dll.

HTH, Marcelo Finkielsztein

Marcelo Finki
sumber