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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.