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?
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?
Câu trả lời:
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
Có, có:
some-cmdlet | out-host -paging
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ị.
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
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.
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.
out-host -paginglà oh -pa.
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.
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.
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
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"
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
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
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 headvà tail? EggHeadCafe có một ví dụ về:
type my.txt | select-object -first 10
type my.txt | select-object -last 10
để thi đua headvà tail.
headvà tailtrong powershell ngay bây giờ: stackoverflow.com/a/41626586/1081043
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).
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
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 :-)
Đề 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