Tương đương với lệnh 'more' hoặc 'less' trong Powershell?


92

Có cách nào để phân trang đầu ra bằng cách chuyển nó tới một số lệnh 'more', có sẵn trong linux \ unix shell không?


Đối với những người không biết ít hơn, một số điều thú vị về nó là bạn có thể quay ngược lại, sử dụng mũi tên, sử dụng trang lên / xuống và thậm chí tìm kiếm bằng phím '/' và kết quả được đánh dấu.
Constantino Cronemberger

Câu trả lời:


65

Chà ... Còn "nhiều hơn", ít nhiều (...) giống như bạn mong đợi từ các nền tảng khác. Hãy thử ví dụ sau:

dir -rec | more

1
hơn làm chính xác điều đó, khi bạn có một cái nhìn vào định nghĩa của hàm với gcm thêm | chọn Definition | fl
Joey

2
Trên thực tế, đường ống đến nhiều hơn cũng giống như đường ống đến "phân trang ngoài máy chủ", điều này tách biệt với việc triển khai more.com. Trong thực tế, không có sự khác biệt rõ ràng.
Jouni Heikniemi

1
Hấp dẫn! Đối với tôi, gcm more trả về hai định nghĩa, một là hàm PowerShell, khi được cung cấp một đối số trống, "$ input | out-host -p", đó là hành vi tôi đang thấy trên gci -rec | hơn. Mặt khác, khi tôi thực hiện gci -rec | more.com, tôi nhận được hành vi bình thường more.com. Trên W7 RC có cài đặt PS2, tôi dường như nhận được nhiều hơn.com ngay cả khi chỉ gõ "thêm". Trên Vista với PS1, hành vi được mô tả ở trên xảy ra. Dựa trên huddledmasses.org/… , bạn có nghĩ rằng hàm cũng nên được thực thi trên W7 không? Hmm ...
Jouni Heikniemi

1
Xin lỗi, điều đó không được viết tốt. Vì vậy, quan điểm của tôi là trên Vista với PowerShell 1, đường ống để chỉ "more" gọi Out-Host -p trong khi trên W7 với PowerShell 2, nó gọi more.com.
Jouni Heikniemi

1
Eep, tôi đứng sửa lại. Lấy làm tiếc. Vâng, thực sự, trong PS 1, nó gọi Out-Host -p, không phải hơn.com (lưu ý với bản thân: Luôn đọc toàn bộ hàm, ngay cả khi nó trông rất giống nhau)
Joey

102

Có, có:

some-cmdlet | out-host -paging


Tôi đã sử dụng nhiều hơn và ít hơn trước đây, không thân thiện với người dùng như tôi nghĩ có thể. Tôi thấy biến thể này hữu ích / có thể sử dụng hơn những biến thể khác. Cảm ơn rất nhiều.
TheXenocide

Đối với việc in nội dung của một tệp rất lớn, điều này rất hiệu quả đối với tôi vì lệnh ghép ngắn Get-Content bắt đầu vô nghĩa để chuyển nội dung đến lệnh ghép ngắn bên ngoài máy chủ.
Germán

13
Lưu ý rằng tham số -Paging của Out-Host không được hỗ trợ trong PowerShell ISE.
Martin Hollingsworth

@BrunoBrant Đó không phải là vấn đề. Bạn có thể chuyển đầu ra cho bất cứ thứ gì; lesschỉ là một ứng dụng xem văn bản lớn chấp nhận stdinvăn bản. Bạn có thể chuyển nó vào một tệp tạm thời và mở nó trong nanohoặc vimcho NGAY LẬP TỨC POWERRRR! Không phải vấn đề. PowerShell giống như bash(nhưng tốt hơn, imho). lesskhông ở trong bash; nó là một nhị phân riêng biệt. Vì vậy lời phê bình của bạn không có giá trị.
Alan McBee - MSFT

7
Ngoài ra, nhận xét về câu trả lời: bí danh ohlà cho Out-Host, và các thông số có thể viết tắt nếu không có xung đột, vì vậy các lệnh có thể làSome-Cmdlet | oh -p
Alan McBee - MSFT

33

dir -rec | more là lời khuyên tồi.

Nó sẽ khiến cho powershell đánh giá toàn bộ lệnh trước khi xuất nó ra màn hình, điều gì đó không cần thiết cho một cái gì đó như phân trang đầu ra

Trong một số trường hợp nghiêm trọng, nó có thể khiến hệ thống bị sập (ví dụ dir 'C:\' | more:)

Mặt khác, việc sử dụng out-host -pagingsẽ xuất thông tin ra màn hình khi nó có sẵn.


2
Khi bạn sử dụng powershell từ xa và muốn truyền một lệnh trên máy chủ windows từ xa thông qua một máy nhắn tin, đường dẫn qua sẽ out-host -paging hoạt động như mong muốn. Đường ống morekhi chạy lệnh từ xa không được sử dụng: toàn bộ văn bản được hiển thị cùng một lúc.
IllvilJa

5
Bí danh cho out-host -pagingoh -pa.
Josh

26

Các Extensions Cộng đồng Powershell có một chức năng tiện dụng có tên là 'ít' mà cung cấp một hoàn chỉnh hơn Unix-phong cách tính năng thiết lập, sử dụng một bản sao được chuyển của less.exe để thực sự xử lý các phân trang.

Bạn có thể cài đặt nó bằng cách khởi động trình bao quản trị và chạy:

Find-Package pscx | Install-Package -Force

( forcelà nâng cấp các phiên bản cũ hơn)

Bạn có thể nối chuỗi vào nó hoặc đặt tên tệp làm tham số trực tiếp.

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

Nó hoạt động trong cửa sổ ConEmu và Powershell, nhưng tiếc là nó không hoạt động theo cách bạn mong đợi trong ISE v2.0.


5
Quá trình cài đặt ghi đè một số lệnh Powershell cơ bản (gcb, Expand-Archive, Format-Hex, Get-Hash, trợ giúp, nhắc nhở, Get-Clipboard, Get-Help, Set-Clipboard) vì vậy nói " forcelà nâng cấp các phiên bản cũ hơn" có vẻ là một một chút sai lệch.
TNT

chỉ cần cài đặt cho người dùng hiện tại mà không có lỗi hoặc cảnh báo sử dụng:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich

Cảm ơn vì mẹo tuyệt vời!
Rui Craveiro

7

Tôi thích lệnh "less" hơn lệnh "more". Với lệnh less, kết quả cũng có thể được phân trang ngược lại thay vì chỉ chuyển tiếp.

"Ít hơn" từ Git cho Windows phù hợp với tôi (Đường dẫn của tôi là C:\Program Files (x86)\Git\usr\less.exe. Tôi đã gặp lỗi trong Powershell với phiên bản Gow của "ít hơn".

Thí dụ:

ls|less

Để tiết kiệm việc nhập, tôi đã thêm bí danh "l" cho ít hơn trong hồ sơ Powershell của mình:

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


2
Tôi cũng vậy. Bên cạnh việc phân trang ngược lại, ít cho phép tôi thực hiện tìm kiếm văn bản trên kết quả (gạch chéo về phía trước, sau đó nhập văn bản, sau đó nhấn enter, sau đó 'n' cho kết quả tiếp theo, 'p' cho kết quả trước đó). Rất, rất, thuận tiện.
Rui Craveiro

Một lessngười hâm mộ khác ở đây. Nhưng tôi gặp lỗi này. Có lời khuyên nào không? ________________________________________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, Đây là phiên bản Git chính thức của less.exe. Bạn đã dùng thử phiên bản Git dành cho Windows gitforwindows.org ít hơn chưa?
Josh

Không cần sử dụng "out-host". Tôi sử dụng cái này: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger

1
Bạn cũng nên đặt $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", vì vậy nó sẽ được sử dụng chẳng hạn khi bạn nhập "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

morekhông được sử dụng để giới hạn đầu ra, nó được sử dụng để phân trang đầu ra và giúp dễ đọc hơn trong thiết bị đầu cuối, nếu có.

Bạn đang nói về việc sử dụng headtail? EggHeadCafe có một ví dụ về:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

để thi đua headtail.


Piping cực kỳ chậm đối với các tệp lớn. Có nhiều cách tốt hơn (các tùy chọn tích hợp sẵn) để thực hiện headtailtrong powershell ngay bây giờ: stackoverflow.com/a/41626586/1081043
khôn ngoan

2

Tôi đã thêm định nghĩa hàm và bí danh vào hồ sơ mặc định của mình tại %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

Chức năng này hầu hết dựa trên mục blog này của Aman Dhally với việc bổ sung xử lý ngoại lệ để nhấn Qtrong khi phân trang.

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

vì vậy tôi chỉ có thể gọi nó là like dir -r | morevà nó ngay lập tức bắt đầu đầu ra được phân trang do đường ống của PowerShell (trái ngược với việc chờ đợi đầu ra hoàn chỉnh với more.com).


1

Nếu bạn đã cài đặt VIM, tôi hoàn toàn thích thú dir -r | vim -R -. Thật không may, điều này gặp phải vấn đề tương tự với more(tức là không phát trực tuyến).


1
cat C:\Temp\test.txt

cat là bí danh của Get-Content - với các tệp lớn hơn, bạn sẽ nhận được - Nhiều hơn - đầu ra ở cuối thiết bị đầu cuối

Bạn cũng có thể thêm -wait

cat C:\Temp\test.txt -wait 

-wait giống như sử dụng đuôi nhưng nó thực sự là chạy lại lệnh chỉ làm mới đầu ra

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

oh = Out-Host


1

Tôi đã có chính xác câu hỏi này (tôi muốn ít hơn, không nhiều hơn) và nhận thấy câu trả lời của @ richard-berg phù hợp với tôi, là người mới sử dụng PowerShell (nhưng không phải Linux), tôi thấy câu trả lời đó còn thiếu (đối với tôi) là: Đầu tiên tôi cần phải truy cập:

Find-Package pscx | Install-Package

mà sau đó được nhắc "cài đặt gói nuget". Tôi đã làm điều này nhưng sau đó phải sử dụng
-AllowClobbertham số trên Install-Package.

sau đó để sử dụng ít hơn, tôi phải:

Set-ExecutionPolicy RemoteSigned

mà tất cả đều hoạt động :-)


Chào mừng đến với trang web. Không chắc bạn hiểu "câu trả lời # 24" là gì. Những con số đó là số phiếu bầu (có thể thay đổi) chứ không phải là sự thống kê.
mhhollomon

À, tôi hiểu rồi ... lần đầu tiên tôi đã đăng để ngăn xếp tràn! Tôi có nghĩa là câu trả lời của @ richard-berg, đối với tôi, đó sẽ là câu trả lời được chấp nhận
Bill Naylor

Không chắc tại sao tôi lại bị bỏ phiếu? Có vẻ như (đối với tôi) sẽ rất hữu ích nếu bạn xác nhận xem điều gì đó đã hoạt động!
Bill Naylor

0

Đề xuất: Đặt tệp vào tệp .txt tạm thời / dùng một lần, sau đó cho phép Hệ điều hành gọi trình chỉnh sửa yêu thích của bạn, trình chỉnh sửa được liên kết với phần mở rộng .txt.

Nhận quá trình | Temp.txt ngoài tệp; . \ temp.txt

Lưu ý: mỗi lần sử dụng, bạn sẽ ghi đè lên bất kỳ tệp temp.txt nào đã tồn tại trước đó. Chọn tên tệp một cách khôn ngoan.

Trên đây chỉ là một ý tưởng cơ bản.
Bước tiếp theo sẽ là chuyển nó thành "| more" bằng cách sử dụng bí danh hoặc hàm hồ sơ, v.v.

HTH, Marcelo Finkielsztein

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.