5

I'm trying to store the output of powershell in a var:

import subprocess subprocess.check_call("powershell \"Get-ChildItem -LiteralPath 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' -ErrorAction 'Stop' -ErrorVariable '+ErrorUninstallKeyPath'\"", shell=True, stderr=subprocess.STDOUT) 

this way, using check_call, it prints ok, for example:

DisplayName : Skype™

but this way it only prints to screen, so i have to use

import subprocess output = subprocess.check_output("powershell \"Get-ChildItem -LiteralPath 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' -ErrorAction 'Stop' -ErrorVariable '+ErrorUninstallKeyPath'\"", shell=True, stderr=subprocess.STDOUT) 

but then, using check_output, i get:

DisplayName : SkypeT

how can i work around this?

2 Answers 2

2

Following this post instructions:How to make Unicode charset in cmd.exe by default?

Its possible to bypass this encoding problem

import subprocess output = subprocess.check_output("chcp 65001 | powershell \"Get-ChildItem -LiteralPath 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' -ErrorAction 'Stop' -ErrorVariable '+ErrorUninstallKeyPath'\"", shell=True, stderr=subprocess.STDOUT) 
Sign up to request clarification or add additional context in comments.

1 Comment

why do you transfer output of chcp to powershell? maybe you meant && instead of | ?
1

The output is a of type bytes so you need to either decode it to a string with .decode('utf-8') (or with whatever codec you want), or use str(), Example:

import subprocess output_bytes = subprocess.check_output("powershell \"Get-ChildItem -LiteralPath 'HKLM:SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall' -ErrorAction 'Stop' -ErrorVariable '+ErrorUninstallKeyPath'\"", shell=True, stderr=subprocess.STDOUT) output_string = str(output_bytes) # alternatively # output_string = output_bytes.decode('utf-8') # there are lots of \r\n in the output I encounterd, so you can split # to get a list output_list = output_string.split(r'\r\n') # once you have a list, you can loop thru and print (or whatever you want) for e in output_list: print(e) 

The key here is to decode to whatever codec you want to use in order to produce the correct character when printing.

3 Comments

Hello, thank you for your reply, but the result was the same... I managed to solve it following this post: link i'm posting an anwser with the correct code
You can also set text=True to obtain results as str instead of bytes, or encoding='utf-8' to set a specific encoding.
encoding='ISO-8859-1' worked for me.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.