Windows 从cmd.exe命令捕获的输出缺少最终换行符

Windows 从cmd.exe命令捕获的输出缺少最终换行符,windows,powershell,cmd,command-line,command,Windows,Powershell,Cmd,Command Line,Command,我试图在PowerShell中使用Invoke Expression调用内置的cmd命令,如echo,并将其转换为字节数组,但命令输出中缺少换行符 例如: ([Text.Encoding]::ASCII).GetBytes((iex "cmd /c echo.")) 它不返回任何内容,而是返回换行符序列(CRLF)。我找到了一个解决方案。不完美,但我会将输出写入文件,用[System.IO.file]::ReadAllBytes(“文件路径”) 并保存到变量我找到了一个解决方案。不完美,但我会

我试图在PowerShell中使用
Invoke Expression
调用内置的
cmd
命令,如
echo
,并将其转换为字节数组,但命令输出中缺少换行符

例如:

([Text.Encoding]::ASCII).GetBytes((iex "cmd /c echo."))

它不返回任何内容,而是返回换行符序列(CRLF)。

我找到了一个解决方案。不完美,但我会将输出写入文件,用
[System.IO.file]::ReadAllBytes(“文件路径”)

并保存到变量

我找到了一个解决方案。不完美,但我会将输出写入文件,用
[System.IO.file]::ReadAllBytes(“文件路径”)

并保存到变量

tl;医生:

PS> ([text.encoding]::ASCII).GetBytes(((cmd /c echo.) -join "`r`n") + "`r`n")
13
10
旁白:

请继续阅读背景信息和注意事项


当PowerShell从外部程序如
cmd.exe
捕获stdout输出时,它返回一个输出行数组,并从每个行中修剪尾随的换行序列

顺便说一句:是
[控制台]::outpuntencoding
报告的字符编码决定了PowerShell如何解释输出,它在Windows PowerShell中默认为旧系统区域设置的OEM代码页,并且在撰写本文时,仍然在Windows上的PowerShell内核中,尽管如此,假设PowerShell Core以其他方式使用(无BOM)UTF-8作为默认编码

在您的例子中,
cmd/c echo.
发出了一个Windows换行符序列CRLF,用PowerShell术语来说,它是
“`r`n”
(您也可以使用
[Environment]::newline
获得适合平台的换行符字符串)

PowerShell将其解释为一个空行,并且由于在数组元素中不包含尾随的换行符,并且PowerShell将展开一个单个元素数组,因此最终得到的是
'
,即空字符串-这就是
([text.encoding]::ASCII).GetBytes()
调用没有生成输出的原因

您可以通过以下方式将PowerShell创建的输出线阵列重新组合为单个多行输出字符串:

  • 用换行符连接数组元素(
    -join“`r`n”
  • 追加最后的尾随换行符(
    +“`r`n”
如上所示

注意事项:此“重新组装”提出了两个可能并不总是正确的假设:

  • 外部程序确实发出了Windows CRLF序列,而不是UNIX LF-only字符

    • 然而,实际上,这种差异在PowerShell中很少重要,因为它可以互换地接受两种换行形式
  • 外部程序确实发出了一个尾随的换行符-这通常是正确的,但不一定是正确的

如果这些假设有问题,将输出重定向到一个文件,并读取该文件(如中所示)是正确的解决方案

注意事项
在Windows PowerShell中,默认情况下创建UTF-16LE文件(并且总是附加一个换行符),因此您不会获得ASCII字节;因此,使用
cmd
自己的重定向生成文件(将使用
chcp
指示的传统OEM编码,它通常是ASCII的超集):


tl;医生:

PS> ([text.encoding]::ASCII).GetBytes(((cmd /c echo.) -join "`r`n") + "`r`n")
13
10
旁白:

请继续阅读背景信息和注意事项


当PowerShell从外部程序
cmd.exe
捕获stdout输出时,它返回一个输出行数组
,并从每个行中修剪尾随的换行序列

顺便说一句:是
[控制台]::outpuntencoding
报告的字符编码决定了PowerShell如何解释输出,它在Windows PowerShell中默认为旧系统区域设置的OEM代码页,并且在撰写本文时,仍然在Windows上的PowerShell内核中,尽管如此,假设PowerShell Core以其他方式使用(无BOM)UTF-8作为默认编码

在您的例子中,
cmd/c echo.
发出了一个Windows换行符序列CRLF,用PowerShell术语来说,它是
“`r`n”
(您也可以使用
[Environment]::newline
获得适合平台的换行符字符串)

PowerShell将其解释为一个空行,并且由于在数组元素中不包含尾随的换行符,并且PowerShell将展开一个单个元素数组,因此最终得到的是
'
,即空字符串-这就是
([text.encoding]::ASCII).GetBytes()
调用没有生成输出的原因

您可以通过以下方式将PowerShell创建的输出线阵列重新组合为单个多行输出字符串:

  • 用换行符连接数组元素(
    -join“`r`n”
  • 追加最后的尾随换行符(
    +“`r`n”
如上所示

注意事项:此“重新组装”提出了两个可能并不总是正确的假设:

  • 外部程序确实发出了Windows CRLF序列,而不是UNIX LF-only字符

    • 然而,实际上,这种差异在PowerShell中很少重要,因为它可以互换地接受两种换行形式
  • 外部程序确实发出了一个尾随的换行符-这通常是正确的,但不一定是正确的

如果这些假设有问题,将输出重定向到一个文件,并读取该文件(如中所示)是正确的解决方案

注意事项
在Windows PowerShell中,默认情况下创建UTF-16LE文件(并且总是附加一个换行符),因此您不会获得ASCII字节;因此,使用
cmd
自己的重定向生成文件(将使用
chcp
指示的传统OEM编码,即