Windows 从cmd.exe命令捕获的输出缺少最终换行符
我试图在PowerShell中使用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(“文件路径”) 并保存到变量我找到了一个解决方案。不完美,但我会
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编码,即