最近我从Windows'cmd.exe迁移到了PowerShell。后来我发现Microsoft决定放弃标准的stdin重定向方法abc.exe < input.txt
并建议使用Get-Content input.txt | .\abc.exe
。
不幸的是,新方法崩溃了我的应用程序。我创建了这个简单的程序来找到问题的根源
#include <cstdio>
int main() {
int x = -1;
scanf("%d", &x);
printf("%d", x);
return 0;
}
并发现此测试程序在input.txt内返回-1而不是数字。
我还测试了echo 1 | .\abc.exe
和type input.txt | .\abc.exe
等命令,并且所有命令都将-1打印到stdout。
如果有任何帮助,我将不胜感激。
修改1:
$ OutputEncoding命令的结果:
IsSingleByte : True
BodyName : us-ascii
EncodingName : US-ASCII
HeaderName : us-ascii
WebName : us-ascii
WindowsCodePage : 1252
IsBrowserDisplay : False
IsBrowserSave : False
IsMailNewsDisplay : True
IsMailNewsSave : True
EncoderFallback : System.Text.EncoderReplacementFallback
DecoderFallback : System.Text.DecoderReplacementFallback
IsReadOnly : True
CodePage : 20127
编辑2:
我创建了这个简单的程序来查看管道编程的内容:
#include <cstdio>
int main() {
char l;
while(scanf("%c", &l)) {
printf("%d\n", l);
}
return 0;
}
运行Get-Content input.txt | .\abc.exe
后,它会保持打印10,这与ASCII“换行”字符相对应。
答案 0 :(得分:1)
显然,PowerShell有多个地方需要在一切开始正常工作之前设置编码。
最后,我想出了这个解决方案 - 在PS文件文件中添加此文本下方的行:
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
chcp 1250 // Change here for preferable Windows Code Page. 1250 is Central Europe
$OutputEncoding = [Console]::OutputEncoding
Clear-Host // clear screen because chcp prints text "Active code page: (code page)"
包含这些行后,Get-Content
开始正常运行。