`more.com`返回“内存不足”。

时间:2019-03-19 19:26:48

标签: windows powershell cmd powershell-v5.0

环境详细信息:

  • x64 Win7 SP1 Enterprise
  • Windows PowerShell v5.0

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

  

没有足够的内存。

当我尝试执行helpman时。无论我使用本地powershell.exe还是,都会发生这种情况。

奇怪的是,我能够执行我尝试过的任何其他别名,并且不会将其添加到$Error变量中,所以我不知道从哪里开始进行故障排除(我已经尝试过{{1 }}和-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

1 个答案:

答案 0 :(得分:3)

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

  

没有足够的内存。

错误。

我没有足够的知识来弄清楚为什么引发该消息或如何在不同系统上复制该消息(例如,我无法在x64 Windows 10 1804 Pro上复制),但是可以通过将OutputEncoding上的[System.Console]静态成员更改为默认编码(在本例中为CP437,这是我的主持人的默认编码)来补救:

[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