|
import platform |
|
import os |
|
from ..subprocess_code_interpreter import SubprocessCodeInterpreter |
|
|
|
class PowerShell(SubprocessCodeInterpreter): |
|
file_extension = "ps1" |
|
proper_name = "PowerShell" |
|
|
|
def __init__(self): |
|
super().__init__() |
|
|
|
|
|
if platform.system() == 'Windows': |
|
self.start_cmd = 'powershell.exe' |
|
|
|
else: |
|
self.start_cmd = os.environ.get('SHELL', 'bash') |
|
|
|
def preprocess_code(self, code): |
|
return preprocess_powershell(code) |
|
|
|
def line_postprocessor(self, line): |
|
return line |
|
|
|
def detect_active_line(self, line): |
|
if "## active_line " in line: |
|
return int(line.split("## active_line ")[1].split(" ##")[0]) |
|
return None |
|
|
|
def detect_end_of_execution(self, line): |
|
return "## end_of_execution ##" in line |
|
|
|
def preprocess_powershell(code): |
|
""" |
|
Add active line markers |
|
Wrap in try-catch block |
|
Add end of execution marker |
|
""" |
|
|
|
code = add_active_line_prints(code) |
|
|
|
|
|
code = wrap_in_try_catch(code) |
|
|
|
|
|
code += '\nWrite-Output "## end_of_execution ##"' |
|
|
|
return code |
|
|
|
def add_active_line_prints(code): |
|
""" |
|
Add Write-Output statements indicating line numbers to a PowerShell script. |
|
""" |
|
lines = code.split('\n') |
|
for index, line in enumerate(lines): |
|
|
|
lines[index] = f'Write-Output "## active_line {index + 1} ##"\n{line}' |
|
return '\n'.join(lines) |
|
|
|
def wrap_in_try_catch(code): |
|
""" |
|
Wrap PowerShell code in a try-catch block to catch errors and display them. |
|
""" |
|
try_catch_code = """ |
|
try { |
|
$ErrorActionPreference = "Stop" |
|
""" |
|
return try_catch_code + code + "\n} catch {\n Write-Error $_\n}\n" |