如果您的实际问题是如何将powershell输出为Unicode文本,那么您应该将其放在标题中(我不知道“默认Windows显示语言编码”应该是什么)。检查powershell是否接受显式参数以指定其标准输出编码($outpunecoding)。无关:在W

如果您的实际问题是如何将powershell输出为Unicode文本,那么您应该将其放在标题中(我不知道“默认Windows显示语言编码”应该是什么)。检查powershell是否接受显式参数以指定其标准输出编码($outpunecoding)。无关:在W,windows,powershell,python-3.x,unicode,subprocess,Windows,Powershell,Python 3.x,Unicode,Subprocess,如果您的实际问题是如何将powershell输出为Unicode文本,那么您应该将其放在标题中(我不知道“默认Windows显示语言编码”应该是什么)。检查powershell是否接受显式参数以指定其标准输出编码($outpunecoding)。无关:在Windows上使用字符串来传递命令,即使用'a | b | c'而不是['a'、'|'、'b'、'|'、'c']。这是一个很好的解决方法,但似乎并不简单。另外请看,无论如何,我都有兴趣找出其他可能用途的默认语言编码。不要使您的任务复杂化。我不知


如果您的实际问题是如何将
powershell
输出为Unicode文本,那么您应该将其放在标题中(我不知道“默认Windows显示语言编码”应该是什么)。检查powershell是否接受显式参数以指定其标准输出编码(
$outpunecoding
)。无关:在Windows上使用字符串来传递命令,即使用
'a | b | c'
而不是
['a'、'|'、'b'、'|'、'c']
。这是一个很好的解决方法,但似乎并不简单。另外请看,无论如何,我都有兴趣找出其他可能用途的默认语言编码。不要使您的任务复杂化。我不知道什么是“默认语言编码”:它是
'mbcs'
(Windows编码)吗?是否从
chcp
输出进行编码(Windows“ANSI”编码)?是否泄漏了Unicode API抽象(UCS-2或UTF-16le w/out BOM)?问题:“如何为可能包含任意Unicode字符的给定命令获取powershell标准输出?”与“什么是默认Windows显示语言编码”?»不同。(1)您的代码使用二进制模式。stdout在您的案例中是个字节
universal_newlines=True
启用文本模式(是的。这不是直观的拼写)(2)cp437和cp1252都与ascii字符的ascii编码兼容(工作
。decode('ascii',strict')
表示标准输出中的所有字节都在ascii范围内。它无法区分cp437和cp1252)。@J.F.Sebastian,管道输出的编码似乎使用控制台输出代码页。我使用各种代码页进行了测试,例如w/1252:
ctypes.windl.kernel32.SetConsoleOutputCP(1252)
p=subprocess.Popen('powershell echo$([char]0xc9'),stdout=subprocess.PIPE)
p.stdout.read()
。奇怪的是,如果我通过
creationflags=DETACHED_PROCESS
,这样powershell.exe就不会连接到控制台,那么愚蠢的事情甚至没有ANSI代码页的合理默认值。它一点输出都没有。我已经在使用python3了。它通过标记显式标记为python-3.x问题。另外,您可以从代码(b'')中看到,这是python3。该bug与问题中的问题无关。错误是关于如何将命令行传递到Windows,问题是关于子进程的标准输出编码。事实上,它们是一样的:如果在Windows上使用unicode(W)API,您将使它工作,而不必解码/编码。@sorin您的建议是什么?要以其他方式从python调用它?@sorin:请在python 3中提供一个代码示例,该示例以Unicode形式返回子进程的stdout,而不管它返回的是什么
chcp
或它对应的是什么“mbcs”。我假设您已将py.exe配置为运行python 3。为他人的利益添加
-3
选项。否则,一个大+1。回答得不错。至于PowerShell的对象管道,似乎您必须完全获得一个二进制管道,以避免文本编码和LF转换为CRLF时遇到的问题。在为管道创建进程时,cmdshell只需重定向自己的标准句柄。一旦程序建立起来,它就不会像中间人那样妨碍我了。我没想到当我问这个问题的时候会这么困难。感谢您投入的时间和详细的回答!您似乎是最有资格回答有关Windows控制台编码的问题的人之一。
def get_interfaces():
    ps = subprocess.Popen(['powershell', 'Get-NetAdapter', '|', 'select Name', '|', 'fl'], stdout = subprocess.PIPE)
    stdout, stdin = ps.communicate(timeout = 10)
    interfaces = []
    for i in stdout.split(b'\r\n'):
        if not i.strip():
            continue
        if i.find(b':')<0:
            continue
        name, value = [ j.strip() for j in i.split(b':') ]
        if name == b'Name':
            interfaces.append(value.decode('ascii')) # This fails for other users
    return interfaces