`more.com` возвращает" Недостаточно памяти. " - PullRequest
4 голосов
/ 19 марта 2019

Сведения об окружении:

  • x64 Win7 SP1 Enterprise
  • Windows PowerShell v5.0

Без загруженных профилей, мой локальный сеансы возвращаются

Недостаточно памяти.

, когда я пытаюсь выполнить help или man.Это происходит независимо от того, использую ли я собственный powershell.exe или .

Странно, я могу выполнить любые другие псевдонимы, которые я пробовал, и это не добавляет кПеременная $Error, поэтому я не знаю, с чего начать устранение неполадок (я пробовал -ErrorAction Stop и $ErrorActionPreference = 'Stop').

В качестве сноски у меня нет повышенных привилегий.


После некоторого исследования я обнаружил, что man на самом деле является псевдонимом для help, который не является псевдонимом для Get-Help, но является отдельной функцией с таким определением:

function help {
<#
.FORWARDHELPTARGETNAME Get-Help
.FORWARDHELPCATEGORY Cmdlet
#>
    [CmdletBinding(DefaultParameterSetName = 'AllUsersView', HelpUri = 'http://go.microsoft.com/fwlink/?LinkID=113316')]
    param(
        [Parameter(Position = 0, ValueFromPipelineByPropertyName = $true)]
        [string]
        ${Name},

        [string]
        ${Path},

        [ValidateSet('Alias', 'Cmdlet', 'Provider', 'General', 'FAQ', 'Glossary', 'HelpFile', 'ScriptCommand', 'Function', 'Filter', 'ExternalScript', 'All', 'DefaultHelp', 'Workflow', 'DscResource', 'Class', 'Configuration')]
        [string[]]
        ${Category},

        [string[]]
        ${Component},

        [string[]]
        ${Functionality},

        [string[]]
        ${Role},

        [Parameter(ParameterSetName = 'DetailedView', Mandatory = $true)]
        [switch]
        ${Detailed},

        [Parameter(ParameterSetName = 'AllUsersView')]
        [switch]
        ${Full},

        [Parameter(ParameterSetName = 'Examples', Mandatory = $true)]
        [switch]
        ${Examples},

        [Parameter(ParameterSetName = 'Parameters', Mandatory = $true)]
        [string]
        ${Parameter},

        [Parameter(ParameterSetName = 'Online', Mandatory = $true)]
        [switch]
        ${Online},

        [Parameter(ParameterSetName = 'ShowWindow', Mandatory = $true)]
        [switch]
        ${ShowWindow}
    )

    #Set the outputencoding to Console::OutputEncoding. More.com doesn't work well with Unicode.
    $outputEncoding = [System.Console]::OutputEncoding

    Get-Help @PSBoundParameters | more
}

Еще дальше ... more - это еще одна функция:

function more {
    param([string[]]$paths)

    $OutputEncoding = [System.Console]::OutputEncoding

    if($paths) {
        foreach ($file in $paths) {
            Get-Content $file | more.com
        }
    }
    else {
        $input | more.com
    }
}

1 Ответ

4 голосов
/ 20 марта 2019

Кажущийся недостатком more.com, он испытывает трудности при обработке многобайтовых кодировок (таких как ) и вместо этого выдает

Недостаточно памяти.

ошибка.

У меня недостаточно знаний, чтобы выяснить почему выдает это сообщение или как его реплицировать в разных системах (например,Я не смог выполнить репликацию на 64-разрядной Windows 10 1804 Pro), но это можно исправить, изменив статический член OutputEncoding на [System.Console] на кодировку по умолчанию (в данном случае CP437, которая была по умолчанию для моего conhost):

[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(437)

или другое однобайтовое кодирование, такое как CP1252.

Если эта ошибка наблюдается в , ее можно исправить с помощью chcp.com (не проверено, обновляет ли это также [Console]::OutputEncoding):

chcp.com 437

В качестве дополнительного примечания код, вызвавший эту ошибку для меня, находится в моем $PROFILE:

[Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = [System.Text.UTF8Encoding]::new()

Проблемы сохранялись при использовании того же хоста консоли, даже после выхода из , когда я былоставлено в приглашении .


Редактировать: для работы powershell мне пришлось сделать комбинированную кодовую страницу + OutputEncoding изменить:

[Console]::OutputEncoding = [Text.Encoding]::GetEncoding(437)
& chcp.com 437
...