Эквивалент команды «больше» или «меньше» в Powershell?

93

Есть ли способ разбить вывод на страницы, связав его с какой-либо командой 'more', которая доступна в оболочках linux \ unix?

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

Ответы:

68

Что ж ... Есть "больше", что более или менее (...) то же самое, что вы ожидаете от других платформ. Попробуйте следующий пример:

dir -rec | more
Йоуни Хейкниеми
источник
1
more делает именно это, когда вы посмотрите на определение функции с помощью gcm. more | select Definition | fl
Джоуи
2
На самом деле, конвейер к more приравнивается к конвейеру с «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, конвейер только для «more» вызывает Out-Host -p, а в W7 с PowerShell 2 он вызывает more.com.
Jouni Heikniemi
1
Ээп, я исправился. Сожалею. Да, действительно, в PS 1 он вызывает Out-Host -p, а не more.com (примечание для себя: всегда читайте всю функцию, даже если она очень похожа)
Джоуи
103

Да, есть:

some-cmdlet | out-host -paging

Шэй Леви
источник
Раньше я использовал больше и меньше, и ни один из них не был настолько удобен в использовании, как я думал. Я обнаружил, что этот вариант более полезен / удобен, чем другие. Огромное спасибо.
TheXenocide
Для печати содержимого очень большого файла это сработало для меня очень хорошо, поскольку командлет Get-Content немедленно начал передавать содержимое командлету out-host.
Germán
13
Обратите внимание, что параметр -Paging Out-Host не поддерживается в PowerShell ISE.
Мартин Холлингсворт,
@BrunoBrant Дело не в этом. Вы можете направить вывод куда угодно; lessэто просто большое приложение stdinдля просмотра текста, которое принимает текст. Вы могли бы труба это временный файл и открыть его в nanoили vimдля четного Moar POWERRRR! Не в этом суть. PowerShell похож bash(но лучше, имхо). lessне входит bash; это отдельный двоичный файл. Значит, ваша критика не обоснована.
Алан МакБи - MSFT
7
Также прокомментируйте ответ: псевдоним ohдля Out-Host, а параметры могут быть сокращены, если нет конфликта, поэтому команда может бытьSome-Cmdlet | oh -p
Алан МакБи - 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 имеют удобную функцию под названием «less», которая предоставляет более полный набор функций в стиле Unix, используя перенесенную копию less.exe для фактической обработки разбиения на страницы.

Вы можете установить его, запустив административную оболочку и запустив:

Find-Package pscx | Install-Package -Force

( forceобновление старых версий)

Вы можете передать ему строки или указать имена файлов как прямые параметры.

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

Он работает в окнах ConEmu и Powershell, но, к сожалению, не работает так, как вы ожидали бы от версии 2.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

Я предпочитаю команду «меньше» команде «больше». С помощью команды less результаты также можно перемещать в обратном направлении, а не только вперед.

У меня работает «меньше» из Git для Windows (мой путь: у C:\Program Files (x86)\Git\usr\less.exeменя были ошибки в Powershell с версией Gow «меньше».

Пример:

ls|less

Чтобы не печатать, я добавил в свой профиль Powershell псевдоним «l» для уменьшения:

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

Джош
источник
2
Я тоже. Помимо перелистывания назад, less позволяет мне выполнять текстовый поиск по результату (косая черта, затем введите текст, затем нажмите 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
@olisteadman, это официальная Git версия less.exe. Вы пробовали Git for Windows gitforwindows.org версии less?
Джош
Нет необходимости использовать "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.

Марк Рушаков
источник
Транспортировка больших файлов выполняется очень медленно. Есть более headtail
удобные
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(т. Е. Нет потоковой передачи).

Mvanle
источник
1
cat C:\Temp\test.txt

cat - это псевдоним для Get-Content - с файлами большего размера вы получите вывод - More - в нижней части терминала.

Вы также можете добавить -wait

cat C:\Temp\test.txt -wait 

-wait похож на использование tail, но на самом деле он повторно запускает команду, просто обновляя вывод

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

oh = Out-Host

Терминал Баш
источник
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 | Out-File temp.txt; . \ temp.txt

Примечание: каждый раз, когда вы используете это, вы будете перезаписывать любой ранее существовавший файл temp.txt. Подбирайте имя файла с умом.

Вышесказанное - это всего лишь основная идея.
Следующим шагом будет преобразование этого в «| больше» с использованием псевдонимов или функций профиля и т. Д.

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

Марсело Финки
источник