环境细节:
没有加载任何配置文件,我的本地powershell会话正在返回
内存不足。
当我尝试执行help
或man
时。无论我使用的是原生的powershell.exe
还是conemu,都会发生这种情况。
奇怪的是,我能够执行我尝试的任何其他别名,并且它不会添加到$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
看似固有的缺陷,它难以处理多字节编码(如utf-8),而是会抛出一个
内存不足。
错误。
我没有足够的知识来弄清楚它为什么抛出该消息或如何在不同的系统上复制它(例如,我无法在x64 Windows 10 1804 Pro上复制),但可以通过更改OutputEncoding
静态成员来修复它在[System.Console]
上的默认编码(在这种情况下,CP437
,这是我的conhost的默认值):
[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(437)
或其他单字节编码,例如CP1252
。
如果在cmd中观察到此错误,可以使用chcp.com
进行修复(未经测试是否也更新[Console]::OutputEncoding
):
chcp.com 437
作为旁注,导致我失败的代码在我的$PROFILE
中:
[Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = [System.Text.UTF8Encoding]::new()
使用相同的控制台主机时问题仍然存在,即使在我离开powershell提示时退出cmd之后也是如此。
编辑:为了PowerShell工作,我不得不做一个组合代码页+ OutputEncoding
更改:
[Console]::OutputEncoding = [Text.Encoding]::GetEncoding(437)
& chcp.com 437