เทียบเท่ากับคำสั่ง 'more' หรือ 'less' ใน Powershell?


94

มีวิธีการแบ่งหน้าผลลัพธ์โดยการไพพ์ไปยังคำสั่ง 'เพิ่มเติม' บางคำซึ่งมีอยู่ใน linux \ unix เชลล์หรือไม่


1
สำหรับผู้ที่ไม่รู้น้อยสิ่งที่น่าสนใจเกี่ยวกับเรื่องนี้ก็คือคุณสามารถย้อนกลับใช้ลูกศรใช้หน้าขึ้น / ลงและแม้แต่ค้นหาโดยใช้ปุ่ม '/' และมีการไฮไลต์ผลลัพธ์
Constantino Cronemberger

คำตอบ:


69

อืม ... มี "มากกว่า" ซึ่งมากหรือน้อย (... ) เหมือนกับที่คุณคาดหวังจากแพลตฟอร์มอื่น ๆ ลองใช้ตัวอย่างต่อไปนี้:

dir -rec | more

1
มากขึ้นไม่ว่าเมื่อคุณดูคำจำกัดความของฟังก์ชันด้วย gcm more | เลือกคำจำกัดความ | fl
Joey

2
จริงๆแล้วการไพพ์ไปยังมากกว่านั้นเท่ากับการไพพ์ไปที่ "เพจนอกโฮสต์" ซึ่งแยกจากการใช้งาน more.com ในทางปฏิบัติไม่มีความแตกต่างที่มองเห็นได้
Jouni Heikniemi

1
น่าสนใจ! สำหรับฉันแล้ว gcm more คืนค่าคำจำกัดความสองคำหนึ่งคือฟังก์ชัน PowerShell ที่เมื่อได้รับอาร์กิวเมนต์ว่างจะทำ "$ input | out-host -p" ซึ่งเป็นพฤติกรรมที่ฉันเห็นใน gci -rec | มากกว่า. ในทางกลับกันเมื่อฉันทำ gci -rec | more.com ฉันมีพฤติกรรมของ more.com ตามปกติ ใน W7 RC ที่ติดตั้ง PS2 ดูเหมือนว่าฉันจะได้รับ more.com แม้ว่าจะพิมพ์แค่ "more" บน Vista กับ PS1 ลักษณะการทำงานที่อธิบายไว้ข้างต้นจะเกิดขึ้น จากhuddledmasses.org/…คุณไม่คิดว่าควรเรียกใช้ฟังก์ชันบน W7 ด้วยหรือไม่? อืม ...
Jouni Heikniemi

1
ขออภัยที่เขียนไม่ดีเป็นพิเศษ ดังนั้นประเด็นของฉันก็คือใน Vista ที่มี PowerShell 1 ไปป์เพียงแค่ "เพิ่มเติม" เรียกใช้ Out-Host -p ในขณะที่อยู่บน W7 ด้วย PowerShell 2 จะเรียกใช้ more.com
Jouni Heikniemi

1
เอ๊ปฉันยืนแก้ไข ขออภัย. ใช่แน่นอนใน PS 1 จะเรียกใช้ Out-Host -p ไม่ใช่ more.com (หมายเหตุถึงตัวเอง: อ่านฟังก์ชันทั้งหมดเสมอแม้ว่าจะดูคล้ายกันมากก็ตาม)
Joey

103

ใช่มี:

some-cmdlet | out-host -paging


เมื่อก่อนฉันใช้มากขึ้นและน้อยลงทั้งยังไม่ค่อยเป็นมิตรกับผู้ใช้เท่าที่ควร ฉันพบว่ารูปแบบนี้มีประโยชน์ / ใช้งานได้มากกว่ารูปแบบอื่น ๆ ขอบคุณมาก ๆ.
TheXenocide

สำหรับการพิมพ์เนื้อหาของไฟล์ขนาดใหญ่มากสิ่งนี้ได้ผลดีมากสำหรับฉันเนื่องจาก cmdlet รับเนื้อหาเริ่มต้น immedialety เพื่อไพพ์เนื้อหาไปยัง cmdlet นอกโฮสต์
Germán

13
โปรดสังเกตว่าพารามิเตอร์ -Paging ของ Out-Host ไม่ได้รับการสนับสนุนใน PowerShell ISE
Martin Hollingsworth

@BrunoBrant นั่นไม่ใช่ประเด็น คุณสามารถไพพ์เอาต์พุตไปยังอะไรก็ได้ lessเป็นเพียงแอปพลิเคชันโปรแกรมดูข้อความขนาดใหญ่ที่ยอมรับstdinข้อความ คุณสามารถไพพ์ไปยังไฟล์ temp และเปิดในnanoหรือvimสำหรับ EVEN MOAR POWERRRR! ไม่ใช่ประเด็น PowerShell เป็นเหมือนbash(แต่ดีกว่า imho) lessไม่ได้อยู่ในbash; มันเป็นไบนารีแยกต่างหาก ดังนั้นคำวิจารณ์ของคุณจึงไม่ถูกต้อง
Alan McBee - MSFT

7
นอกจากนี้แสดงความคิดเห็นเกี่ยวกับคำตอบ: นามแฝงohมีไว้สำหรับOut-Hostและสามารถย่อพารามิเตอร์ได้หากไม่มีข้อขัดแย้งดังนั้นคำสั่งอาจเป็นSome-Cmdlet | oh -p
Alan McBee - MSFT

34

dir -rec | more เป็นคำแนะนำที่ไม่ดี

มันจะทำให้ powershell ประเมินคำสั่งทั้งหมดก่อนที่จะส่งออกไปยังหน้าจอสิ่งที่ไม่จำเป็นสำหรับบางอย่างเช่นการแบ่งหน้าผลลัพธ์

ในบางกรณีที่รุนแรงอาจทำให้ระบบขัดข้อง (เช่นdir 'C:\' | more)

ในทางกลับกันการใช้out-host -pagingจะส่งออกข้อมูลไปยังหน้าจอตามที่มีอยู่


2
เมื่อคุณใช้ powershell ระยะไกลและต้องการไพพ์คำสั่งบนเซิร์ฟเวอร์ windows ระยะไกลผ่านเพจเจอร์การส่งผ่านจะ out-host -paging ทำงานได้ตามต้องการ การส่งผ่านmoreเมื่อเรียกใช้คำสั่งระยะไกลจะไม่มีประโยชน์: ข้อความทั้งหมดจะแสดงพร้อมกัน
IllvilJa

5
นามแฝงของout-host -pagingคือoh -pa.
Josh

26

Powershell ส่วนขยายชุมชนมีฟังก์ชั่นที่มีประโยชน์ที่ชื่อว่า 'น้อย' ที่ให้ Unix สไตล์ชุดคุณลักษณะที่สมบูรณ์มากขึ้นโดยใช้สำเนารังเพลิงของ less.exe จริงจัดการเพจจิ้ง

คุณสามารถติดตั้งได้โดยเริ่มเชลล์ผู้ดูแลระบบและเรียกใช้:

Find-Package pscx | Install-Package -Force

( forceคือการอัปเกรดเวอร์ชันเก่า)

คุณสามารถไพพ์สตริงหรือตั้งชื่อไฟล์เป็นพารามิเตอร์โดยตรง

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

ใช้งานได้ในหน้าต่าง ConEmu และ Powershell แต่น่าเสียดายที่มันไม่ได้ผลอย่างที่คุณคาดหวังภายใต้ ISE v2.0


5
การติดตั้งจะลบล้างคำสั่งพื้นฐานของ Powershell หลายคำสั่ง (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard) ดังนั้นการพูดว่า " forceคือการอัปเกรดเวอร์ชันเก่า" จึงดูเหมือน ทำให้เข้าใจผิดเล็กน้อย
ทีเอ็นที

เพียงแค่ติดตั้งสำหรับผู้ใช้ปัจจุบันโดยไม่มีข้อผิดพลาดหรือคำเตือนใช้:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich

ขอบคุณสำหรับเคล็ดลับสุดเจ๋ง!
Rui Craveiro

9

ฉันชอบคำสั่ง "less" มากกว่าคำสั่ง "more" ด้วยคำสั่ง less ผลลัพธ์ยังสามารถเพจไปข้างหลังแทนที่จะส่งต่อ

"น้อยกว่า" จากGit สำหรับ Windowsใช้ได้กับฉัน (เส้นทางของฉันคือC:\Program Files (x86)\Git\usr\less.exeฉันมีข้อผิดพลาดใน Powershell กับ"less" เวอร์ชันGow

ตัวอย่าง:

ls|less

ในการบันทึกการพิมพ์ฉันได้เพิ่มนามแฝง "l" ให้น้อยลงในโปรไฟล์ Powershell ของฉัน:

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


2
ฉันด้วย. นอกจากการเลื่อนหน้าไปข้างหลังแล้วยังช่วยให้ฉันค้นหาข้อความในผลลัพธ์ได้น้อยลง (เครื่องหมายทับแล้วพิมพ์ข้อความจากนั้นกด Enter จากนั้นกด 'n' สำหรับผลลัพธ์ถัดไป 'p' สำหรับผลลัพธ์ก่อนหน้า) สะดวกมาก
Rui Craveiro

lessแฟนอีกคนที่นี่. แต่ฉันได้รับข้อผิดพลาดนี้ คำแนะนำใด ๆ? ________________________________________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 นี่คือ less.exe เวอร์ชัน Git อย่างเป็นทางการ คุณลอง Git for Windows รุ่นgitforwindows.orgน้อยกว่าหรือไม่?
Josh

ไม่จำเป็นต้องใช้ "โฮสต์นอก" ฉันใช้สิ่งนี้: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Constantino Cronemberger

1
นอกจากนี้ยังควรตั้งค่า $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe" ดังนั้นจึงควรใช้ตัวอย่างเช่นเมื่อคุณพิมพ์ "help"
Constantino Cronemberger


3

moreไม่ได้ใช้เพื่อจำกัดเอาต์พุตมันใช้เพื่อแบ่งหน้าเอาต์พุตและทำให้อ่านในเทอร์มินัลได้ง่ายขึ้นถ้ามีอะไร

คุณกำลังพูดถึงการใช้headและtail? EggHeadCafeมีตัวอย่างของ:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

เพื่อเลียนแบบheadและtail.


การวางท่อช้ามากสำหรับไฟล์ขนาดใหญ่ มีวิธีที่ดีกว่า (ตัวเลือกในตัว) ในการทำheadและtailใน powershell ตอนนี้: stackoverflow.com/a/41626586/1081043
wisbucky

2

ฉันได้เพิ่มนิยามฟังก์ชันและนามแฝงในโปรไฟล์เริ่มต้นของฉันที่ %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

ฟังก์ชันนี้ส่วนใหญ่อิงตามรายการบล็อกนี้โดย Aman Dhallyพร้อมด้วยการจัดการข้อยกเว้นเพิ่มเติมสำหรับการกดQขณะเพจ

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

ดังนั้นฉันสามารถเรียกมันว่า like dir -r | moreและมันจะเริ่มเอาต์พุตเพจทันทีเนื่องจากไปป์ไลน์ของ PowerShell (ตรงข้ามกับการรอผลลัพธ์ที่สมบูรณ์ด้วย more.com)


1

dir -r | vim -R -หากคุณมีการติดตั้งเสียงเรียกผมอย่างทั่วถึงเพลิดเพลินกับ น่าเสียดายที่สิ่งนี้ประสบปัญหาเดียวกันกับmore(กล่าวคือไม่มีการสตรีม)


1
cat C:\Temp\test.txt

cat เป็นนามแฝงสำหรับ Get-Content - ด้วยไฟล์ขนาดใหญ่คุณจะได้รับ - เพิ่มเติม - เอาต์พุตที่ด้านล่างของเทอร์มินัล

คุณยังสามารถเพิ่ม -wait

cat C:\Temp\test.txt -wait 

-wait เหมือนกับการใช้ tail แต่จริงๆแล้วมันเป็นการเรียกใช้คำสั่งใหม่เพียงแค่รีเฟรชเอาต์พุต

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

โอ้ = โฮสต์นอก


1

ฉันมีคำถามนี้อย่างตรงไปตรงมา (ฉันต้องการน้อยลงไม่มาก) และพบว่าคำตอบของ @ richard-berg ใช้ได้ผลสำหรับฉันซึ่งยังใหม่กับ PowerShell (แต่ไม่ใช่สำหรับ Linux) ฉันพบสิ่งที่ขาดหายไปจากคำตอบนั้น (สำหรับฉัน) คือ: ก่อนอื่นฉันต้องไป:

Find-Package pscx | Install-Package

ซึ่งได้รับแจ้งให้ "ติดตั้งแพ็คเกจ nuget" ฉันทำสิ่งนี้แล้ว แต่ก็ต้องใช้
-AllowClobberพารามิเตอร์บนInstall-Package.

จากนั้นเพื่อที่จะใช้น้อยลงฉันต้อง:

Set-ExecutionPolicy RemoteSigned

ซึ่งทั้งหมดได้ผล :-)


ยินดีต้อนรับสู่เว็บไซต์ ไม่แน่ใจว่า "คำตอบ # 24" หมายถึงอะไร ตัวเลขเหล่านี้คือคะแนนเสียง (ซึ่งสามารถเปลี่ยนแปลงได้) มากกว่าการแจกแจง
mhhollomon

อาเห็น ... ครั้งแรกที่โพสต์ลงใน stack overflow! ฉันหมายถึงคำตอบของ @ richard-berg สำหรับฉันนั่นคงเป็นคำตอบที่ยอมรับ
Bill Naylor

ไม่แน่ใจว่าทำไมฉันถึงได้รับการโหวตลดลง? ดูเหมือน (สำหรับฉัน) การยืนยันเมื่อมีบางอย่างได้ผลจะเป็นประโยชน์!
Bill Naylor

0

คำแนะนำ: ใส่ไฟล์ลงในไฟล์. txt ชั่วคราว / ใช้แล้วทิ้งจากนั้นให้ระบบปฏิบัติการเรียกใช้ตัวแก้ไขที่คุณชื่นชอบซึ่งเป็นไฟล์ที่เชื่อมโยงกับนามสกุล.

รับกระบวนการ | ไฟล์ชั่วคราว temp.txt; . \ temp.txt

หมายเหตุ: ทุกครั้งที่คุณใช้สิ่งนี้คุณจะเขียนทับไฟล์ temp.txt ที่มีอยู่แล้ว เลือกชื่อไฟล์อย่างชาญฉลาด

ข้างต้นเป็นเพียงแนวคิดเบื้องต้น
ขั้นตอนต่อไปคือการเปลี่ยนสิ่งนี้เป็น "| เพิ่มเติม" โดยใช้นามแฝงหรือฟังก์ชันโปรไฟล์เป็นต้น

HTH, Marcelo Finkielsztein

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.