Cmd上的树与Powershell上的树看起来不同

Cmd上的树与Powershell上的树看起来不同,powershell,cmd,powershell-ise,Powershell,Cmd,Powershell Ise,为什么Powershell上的tree命令与Cmd上的不同 我相信这是因为它是PowerShell在后台运行cmd的命令之一,然后将输出传输到写入主机,类似于ping或ipconfig。我相信这是因为它是PowerShell在后台运行cmd的命令之一,然后将输出传输到写入主机,类似于ping或ipconfig 问题只出现在PowerShell ISE中,外部程序(如tree.com)的输出不会直接传递到控制台 考虑迁移到电源外壳ISE,考虑到它是底部和底部,特别是无法运行PuxBeS[CARC]

为什么Powershell上的tree命令与Cmd上的不同


我相信这是因为它是PowerShell在后台运行cmd的命令之一,然后将输出传输到写入主机,类似于ping或ipconfig。我相信这是因为它是PowerShell在后台运行cmd的命令之一,然后将输出传输到写入主机,类似于ping或ipconfig

问题只出现在PowerShell ISE中,外部程序(如tree.com)的输出不会直接传递到控制台

考虑迁移到电源外壳ISE,考虑到它是底部和底部,特别是无法运行PuxBeS[CARC] 6 +,在那里所有未来的努力都将继续。提供跨平台的最佳PowerShell开发体验的编辑器与正在积极开发的its相结合。 要修复此问题,您必须临时更改[Console]::OutputEncoding以匹配系统的活动OEM旧代码页,因为这是character encoding tree.com使用的字符编码:

注:

即使在常规控制台窗口/Windows终端窗口和Visual Studio代码[console]::outpuntencoding也可以发挥作用,但只有在捕获或重定向外部程序的输出时,例如,$treeOutput=tree或tree |

如上所述,这对于直接显示输出是不必要的,但在ISE中除外,其中[Console]::OutputEncoding即使在那时也很重要,它默认为系统的活动ANSI遗留代码页。 要使PowerShell在捕获或重定向外部程序时正确解释其输出,[控制台]::OutputEncoding必须与该程序使用的实际编码匹配

因此,如果要捕获或重定向tree.coms输出,可能必须设置[Console]::outpuneCoding:

简而言之,除非[Console]::outpuneCoding.CodePage与[cultureinfo]::CurrentCulture.TextInfo.OEMCodePage报告的代码页码匹配-例如,美国英语系统上的437-否则需要设置[Console]::outpuneCoding

在控制台窗口和windows终端窗口中,从PowerShell 7.0开始,这通常是不必要的-仅当您已将活动代码页显式更改为UTF-8时才有必要,例如-请参阅;请注意,随着时间的推移,UTF-8可能会成为默认值

但是,在Visual Studio代码中,这在默认情况下是必需的,因为在PowerShell集成控制台[Console]::OutputEncoding默认为UTF-8代码页65001

问题只出现在PowerShell ISE中,外部程序(如tree.com)的输出不会直接传递到控制台

考虑迁移到电源外壳ISE,考虑到它是底部和底部,特别是无法运行PuxBeS[CARC] 6 +,在那里所有未来的努力都将继续。提供跨平台的最佳PowerShell开发体验的编辑器与正在积极开发的its相结合。 要修复此问题,您必须临时更改[Console]::OutputEncoding以匹配系统的活动OEM旧代码页,因为这是character encoding tree.com使用的字符编码:

注:

即使在常规控制台窗口/Windows终端窗口和Visual Studio代码[console]::outpuntencoding也可以发挥作用,但只有在捕获或重定向外部程序的输出时,例如,$treeOutput=tree或tree |

如上所述,这对于直接显示输出是不必要的,但在ISE中除外,其中[Console]::OutputEncoding即使在那时也很重要,它默认为系统的活动ANSI遗留代码页。 要使PowerShell在捕获或重定向外部程序时正确解释其输出,[控制台]::OutputEncoding必须与该程序使用的实际编码匹配

因此,如果要捕获或重定向tree.coms输出,可能必须设置[Console]::outpuneCoding:

简而言之,除非[Console]::outpuneCoding.CodePage与[cultureinfo]::CurrentCulture.TextInfo.OEMCodePage报告的代码页码匹配-例如,美国英语系统上的437-否则需要设置[Console]::outpuneCoding

在控制台窗口和windows终端窗口中,从PowerShell 7.0开始,这通常是不必要的-仅当您已将活动代码页显式更改为UTF-8时才有必要,例如-请参阅;请注意,随着时间的推移,UTF-8可能会成为默认值

但是,在Visual Studio代码中,这在默认情况下是必需的,因为在PowerShell集成控制台[Console]::OutputEncoding默认为UTF-8代码页65001


试试其他字体。例如控制台。使用/a选项可以使用文本字符而不是图形字符。原因是,豪华控制台不支持相同的字符集,除非您找到一种方法告诉它这样做。。。现在我找不到任何方法来实现这一点。PS使用ANSI或Unicode,CMD使用OEM akaDOS@Olaf这是一个角色编码
“这是一个问题,所以选择不同的字体没有帮助。@Lee_Dailey注意到这个问题只会影响ISE;设置[控制台]::输出编码到OEM代码页修复;有关详细信息,请参阅我的答案。请尝试其他字体。例如控制台。使用/a选项可以使用文本字符而不是图形字符。原因是,豪华控制台不支持相同的字符集,除非您找到一种方法告诉它这样做。。。现在我找不到任何方法来实现这一点。PS使用ANSI或Unicode,CMD使用OEM akaDOS@Olaf这是一个字符编码问题,所以选择不同的字体不会有帮助。@Lee_Dailey注意到这个问题只会影响ISE;设置[控制台]::输出编码到OEM代码页修复;有关详细信息,请参见我的答案。tree.com是一个外部可执行文件,PowerShell直接调用它-不涉及cmd.exe。在控制台窗口和Visual Studio代码的PowerShell集成终端中,外部程序的输出将传递到控制台,除非捕获或重定向。相反,在ISE中,输出首先在内部捕获和解码,然后打印到显示器上,尽管我怀疑是否涉及实际的写主机调用。tree.com是一个外部可执行文件,PowerShell直接调用它-不涉及cmd.exe。在控制台窗口和Visual Studio代码的PowerShell集成终端中,外部程序的输出将传递到控制台,除非捕获或重定向。相反,在ISE中,输出首先在内部捕获和解码,然后打印到显示器上,尽管我怀疑是否涉及实际的写主机调用。
# Switch the encoding that PowerShell expects external programs to use
# to the active OEM code page.
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(
  [cultureinfo]::CurrentCulture.TextInfo.OEMCodePage
)

# tree.com now produces the expected output in the ISE
tree