I'm trying to start a PowerShell script from python like this:
psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe', './buildxml.ps1', arg1, arg2, arg3], cwd=os.getcwd()) result = psxmlgen.wait()
The problem is that I get the following error:
File C:\Users\sztomi\workspace\myproject\buildxml.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
DESPITE the fact that I did enable running scripts in Powershell a long time ago by typing
Set-ExecutionPolicy Unrestriced in an administrator-ran PS terminal (and did again, just to make sure). The powershell executable is the same that the shortcut in start menu points to.
Get-ExecutionPolicy correctly reports
Unrestricted no matter if I ran PowerShell as admin or not.
How can I execute a PS script correctly from Python?
Set-ExecutionPolicy Unrestriced is on a per user basis, and a per bitness basis (32-bit is different than 64-bit).
Second, you can override the execution policy from the command line.
psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe', '-ExecutionPolicy', 'Unrestricted', './buildxml.ps1', arg1, arg2, arg3], cwd=os.getcwd()) result = psxmlgen.wait()
Apparently you can access the 64-bit PowerShell from 32-bit PowerShell with this path (thanks to @eryksun in comments):
powershell64 = os.path.join(os.environ['SystemRoot'], 'SysNative' if platform.architecture() == '32bit' else 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe')
For those of us who wanted to know how to display the values of arg1, arg2 and arg3 after it was passed to powershell, all you need to do is:
Write-Host $args Write-Host $args Write-Host $args