【发布时间】:2018-07-17 06:14:50
【问题描述】:
编辑:我为(反对?)这种行为创建了一个 PowerShell UserVoice "suggestion";随意点赞。
当我重定向到文件时,PowerShell(5.1.16299.98,Windows 10 Pro 10.0.16299)正在将换行符插入到我的标准错误中 - 就像为控制台格式化一样。让我们生成任意长度的错误消息:
class Program
{
static void Main(string[] args)
{
System.Console.Error.WriteLine(new string('x', int.Parse(args[0])));
}
}
我将以上内容编译为longerr.exe。然后我这样称呼它:
$ .\longerr.exe 60 2>error.txt
我在窗口宽度为 60 的 PowerShell 控制台中运行了以下脚本:
$h = '.\longerr.exe : '.Length
$w = 60 - 1
$f = 'error.txt'
Remove-Item $f -ea Ignore
(($w-$h), ($w-$h+1), ($w), ($w+1), ($w*2-$h), ($w*2-$h+1)) |
% {
$_ >> $f
.\longerr.exe $_ 2>>$f
}
现在我在更宽的控制台中运行了以下命令:
$ Get-Content $f | Select-String '^(?![+\t]|At line| )'
(我可以在文本编辑器中打开文件并修剪线条。)这是输出:
43
.\longerr.exe : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
44
.\longerr.exe :
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
59
.\longerr.exe :
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
60
.\longerr.exe : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxx
102
.\longerr.exe : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
103
.\longerr.exe : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x
PowerShell 为什么要这样做?我可以让它停下来吗?我宁愿不必做这样的事情:
.\longerr.exe $_ 2>&1 |
% {
if ($_ -is [System.Management.Automation.ErrorRecord]) {
$_.Exception.Message | Out-File -FilePath $f -Append
}
}
首先,该文件的所有打开和关闭都可能很慢(我知道我可以添加更多代码并使用StreamWriter),其次,还有一个问题(错误? ) 使用这种方法,我不会在这个问题中讨论。
为了进行完整性检查,我在cmd.exe 中运行了longerr.exe 1000 2>test.txt;它没有插入虚假的换行符。
【问题讨论】:
-
@TessellatingHeckler:谢谢!这解决了我在问题末尾提到的问题,并且需要切换到可以避免我问题的主要问题的编程模式。我发布了一个详细说明问题的答案。如果一个人想避免向
cmd.exe发起攻击,这是一个非常丑陋的解决方案,但至少它是一种解释。
标签: powershell stderr io-redirection