windows - `more.com` 返回 "Not enough memory."

标签 windows powershell cmd powershell-5.0

环境细节:

  • x64 Win7 SP1 企业版
  • Windows PowerShell v5.0

没有加载任何配置文件,我的本地 session 正在返回

Not enough memory.

当我尝试执行 helpman 时。无论我使用的是 native 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
    }
}

最佳答案

more.com 的一个看似固有的缺陷,它很难处理多字节编码(例如 ),而是会抛出一个

Not enough memory.

错误。

我没有足够的知识来弄清楚为什么它会抛出该消息或如何在不同的系统上复制它(例如,我无法在 x64 Windows 10 1804 Pro 上复制),但是可以通过将 [System.Console] 上的 OutputEncoding 静态成员更改为默认编码(在本例中为 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

关于windows - `more.com` 返回 "Not enough memory.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55248656/

相关文章:

java - 使用 CREATE_NEW_PROCESS_GROUP 创建主机时,将 Ctrl+C 发送到子进程

linux - Windows 上的 GUI 在联网的 Linux 机器上运行 Linux 脚本?

regex - Powershell 2与Powershell 5行尾 anchor 的powershell regex问题

powershell - 如何在 EC2 实例上更新 SSL 证书

java - 在 Windows 中从命令行执行 java 程序失败

c++ - 创建 .lib 文件 - 第一次

c - Windows错误参数类型c编程

string - 如何将自定义对象添加到字符串

windows - 如何在 Windows 命令提示符下获取文件?

用于对 URL 进行排序的 Windows 批处理文件脚本