编辑:我为此行为创建了一个PowerShell UserVoice "建议", 请随意投票。
PowerShell (5.1.16299.98, Windows 10 Pro 10.0.16299) 在将我的stderr重定向到文件时插入换行符——就像为控制台格式化一样。让我们生成任意长度的错误消息:
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; 它没有插入任何伪造的换行符。
cmd.exe
,这是一个非常丑陋的解决方案,但至少它是一个解释。 - labreuer