我正在尝试使用Process.Start重定向的I/O来调用PowerShell.exe字符串,并以UTF-8的形式返回输出.但我似乎无法做到这一点.
我尝试过的:
-Command参数运行Console.OutputEncoding在这两个我的控制台应用程序,并在PowerShell脚本$OutputEncoding在PowerShell中设置Process.StartInfo.StandardOutputEncodingEncoding.Unicode而不是做到这一切Encoding.UTF8在每种情况下,当我检查我给出的字节时,我会得到与原始字符串不同的值.我真的很想解释为什么这不起作用.
这是我的代码:
static void Main(string[] args)
{
DumpBytes("Héllo");
ExecuteCommand("PowerShell.exe", "-Command \"$OutputEncoding = [System.Text.Encoding]::UTF8 ; Write-Output 'Héllo';\"",
Environment.CurrentDirectory, DumpBytes, DumpBytes);
Console.ReadLine();
}
static void DumpBytes(string text)
{
Console.Write(text + " " + string.Join(",", Encoding.UTF8.GetBytes(text).Select(b => b.ToString("X"))));
Console.WriteLine();
}
static int ExecuteCommand(string executable, string arguments, string workingDirectory, Action<string> output, Action<string> error)
{
try
{
using …Run Code Online (Sandbox Code Playgroud) 我花了大约一个小时试图弄清楚这里发生了什么,但我根本无法找出原因,也没有意外地找到解决方法。
\n当我运行时,winget upgrade返回的数据已正确编码:
然而,如果我将 winget 升级的响应存储在变量 ( $winget = winget upgrade; $winget;) 中,某些字符会中断,这似乎是一个编码问题:
像这样的 cmdlet 将始终将字符串返回到 PowerShell,因此我猜想将响应分配给变量正在应用一些默认文本编码,也许来自我的 PowerShell 配置文件?我已经尝试将大多数常见代码投射到变量上,但最终会完全破坏数据。
\n我什至以每种可能的编码类型转储了数据,但它们都已损坏:
\nwinget upgrade | Out-File -FilePath C:\\tmp\\test1.txt -Encoding ascii\nwinget upgrade | Out-File -FilePath C:\\tmp\\test3.txt -Encoding default\nwinget upgrade | Out-File -FilePath C:\\tmp\\test4.txt -Encoding string\nwinget upgrade | Out-File -FilePath C:\\tmp\\test5.txt -Encoding unicode\nwinget upgrade | Out-File -FilePath C:\\tmp\\test7.txt -Encoding utf32\nwinget upgrade | Out-File -FilePath C:\\tmp\\test8.txt -Encoding utf7\nwinget upgrade | Out-File -FilePath C:\\tmp\\test9.txt -Encoding utf8\n …Run Code Online (Sandbox Code Playgroud)