Еквівалент команди "більше" чи "менше" у Powershell?


93

Чи є спосіб розподілити сторінку на вихід, передавши його до якоїсь команди 'more', яка доступна в оболонках linux \ unix?


Для тих, хто не знає менше, деякі цікаві речі щодо цього - це те, що ви можете повернутися назад, використовувати стрілки, використовувати сторінку вгору / вниз і навіть шукати за допомогою клавіші '/' та виділяти результати.
Костянтино Кронембергер

Відповіді:


68

Ну ... Є "більше", що більш-менш (...) те саме, що ви очікували б від інших платформ. Спробуйте такий приклад:

dir -rec | more

1
more робить саме це, коли ви дивитесь на визначення функції за допомогою gcm more | виберіть Definition | fl
Joey

2
Насправді, конвеєр до більше дорівнює конвеєру до "out-host -paging", що окремо від реалізації 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, навіть коли набираю просто "більше". На Vista з PS1 відбувається описана вище поведінка. На основі huddledmasses.org/… , чи не вважаєте Ви, що функцію слід виконувати і на W7? Хм ...
Джоуні Хейкніємі

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

Для друку вмісту дуже великого файлу це дуже приємно для мене працювало, оскільки командлет Get-Content розпочав безпосередню передачу вмісту до командлета out-host.
Герман

13
Зверніть увагу, що параметр -Paging Out-Host не підтримується в PowerShell ISE.
Мартін Холлінгсворт,

@BrunoBrant Справа не в цьому. Ви можете спрямувати результат до чого завгодно; less- це просто велика програма для перегляду тексту, яка приймає stdinтекст. Ви можете перенести його у тимчасовий файл та відкрити у nanoабо vimнавіть для EVEN MOAR POWERRRR! Справа не в цьому. PowerShell схожий bash(але краще, імхо). lessне входить bash; це окремий двійковий файл. Тож ваша критика не є дійсною.
Алан Макбі - 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 -pagingis oh -pa.
Джош

26

У Powershell Community Extensions має зручну функцію з ім'ям «менше» , що забезпечує більш повний набір функцій Unix-стиль, використовуючи портированию копію less.exe насправді обробляти підкачки.

Ви можете встановити його, запустивши адміністративну оболонку та запустивши:

Find-Package pscx | Install-Package -Force

( forceце оновити старіші версії)

Ви можете конвеювати до нього рядки або вказувати імена файлів як прямі параметри.

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

Він працює у вікнах ConEmu та Powershell, але, на жаль, він працює не так, як ви очікували б у v2.0 ISE.


5
Встановлення замінює кілька основних команд Powershell (gcb, Expand-Archive, Format-Hex, Get-Hash, help, prompt, Get-Clipboard, Get-Help, Set-Clipboard), тому кажучи, що " forceце оновити старіші версії", здається трохи оманливий.
TNT

просто встановлення для поточного користувача без помилок і попереджень:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Андреас Дітріх

Дякуємо за чудову пораду!
Руй Кравейру,

8

Я віддаю перевагу команді "менше" перед командою "більше". За допомогою команди менше, результати також можна переміщати назад, а не просто вперед.

Мені працює "менше" від Git для Windows (мій шлях такий C:\Program Files (x86)\Git\usr\less.exe. У мене були помилки в Powershell з версією Gow "менше".

Приклад:

ls|less

Щоб заощадити введення тексту, я додав псевдонім "l" за менший розмір у своєму профілі Powershell:

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


2
Я також. Окрім підкачування назад, менше дозволяє мені виконувати пошук тексту за результатом (коса риска, потім набирайте текст, потім натисніть клавішу Enter, потім 'n' для наступного результату, 'p' для попереднього результату). Дуже, дуже, зручно.
Руй Кравейру,

Ще один 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, Це офіційна версія Git less.exe. Ви пробували Git для Windows gitforwindows.org версії менше?
Джош

Не потрібно використовувати "out-host". Я використовую це: "Get-Content tmpf | C: \ cygwin64 \ bin \ less.exe"
Константино Кронембергер,

1
Також дуже гарною ідеєю є встановити $ env: PAGER = "C: \ cygwin64 \ bin \ less.exe", тому воно буде використовуватися, наприклад, коли ви вводите "довідка"
Константино Кронембергер

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

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

Ця функція в основному базується на цій публікації в блозі Амана Даллі з доданою обробкою винятків для натискання 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

тому я можу просто назвати це як " лайк", dir -r | moreі він негайно починає виводити сторінку через конвеєр PowerShell (на відміну від очікування повного виводу з more.com).


1

Якщо у вас встановлений VIM, мені дуже подобається dir -r | vim -R -. На жаль, це страждає тією ж проблемою more(тобто відсутність потокового передавання).


1
cat C:\Temp\test.txt

cat - це псевдонім для Get-Content - із більшими файлами ви отримаєте - Більше - вихід у нижній частині терміналу

Ви також можете додати -чекайте

cat C:\Temp\test.txt -wait 

-wait - це як використання хвоста, але насправді це повторне виконання команди, лише оновлення результату

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

oh = Зовнішній господар


1

У мене було саме це запитання (ну, я хотів менше, не більше) і знайшов відповідь @ richard-berg, який працював на мене, будучи новим у PowerShell (але не в Linux), я знайшов речі, відсутні в цій відповіді (для мене) були: мені спочатку потрібно було піти:

Find-Package pscx | Install-Package

що потім запропонувало "встановити пакет nuget". Я зробив це, але потім довелося використовувати
-AllowClobberпараметр on Install-Package.

то для того, щоб використовувати менше, мені довелося:

Set-ExecutionPolicy RemoteSigned

що все працювало :-)


Ласкаво просимо на сайт. Не впевнені, що ви маєте на увазі під "відповіддю №24". Ці цифри - це голоси (які можуть змінюватися), а не перерахування.
mhhollomon

Ах, я розумію ... вперше я опублікував переповнення стеку! Я мав на увазі відповідь @ richard-berg, для мене це було б прийнятою відповіддю
Білл Нейлор

Не впевнені, чому я отримую голос проти? Здається (для мене) корисно підтвердити, коли щось спрацювало!
Білл Нейлор

0

Пропозиція: Помістіть файл у тимчасовий / одноразовий файл .txt, а потім дозвольте ОС викликати ваш улюблений редактор, той, який пов’язаний із розширенням .txt.

Get-Process | Внефайл temp.txt; . \ temp.txt

Примітка: кожного разу, коли ви використовуєте це, ви будете перезаписувати будь-який існуючий файл temp.txt. З розумом підберіть назву файлу.

Вищевказане - лише основна ідея.
Наступним кроком буде перетворення цього у "| більше" за допомогою псевдонімів або функцій профілю тощо.

HTH, Марсело Фінкільштейн

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.