2011-08-01 36 views
13

Tôi đang cố gắng để bắt đầu một kịch bản PowerShell từ trăn như thế này:Gọi một kịch bản PowerShell từ Python

psxmlgen = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe', 
          './buildxml.ps1', 
          arg1, arg2, arg3], cwd=os.getcwd()) 
result = psxmlgen.wait() 

Vấn đề là tôi nhận được lỗi sau:

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.

Mặc dù thực tế mà tôi đã cho phép chạy các kịch bản trong Powershell một thời gian dài trước đây bằng cách gõ Set-ExecutionPolicy Unrestriced trong một thiết bị đầu cuối PS quản trị viên chạy (và đã làm một lần nữa, chỉ để chắc chắn). Các thực thi PowerShell là giống như các phím tắt trong trình đơn bắt đầu trỏ đến. Get-ExecutionPolicy báo cáo chính xác Unrestricted cho dù tôi có chạy PowerShell với tư cách quản trị viên hay không.

Làm cách nào để thực thi tập lệnh PS chính xác từ Python?

Trả lời

15

Đầu tiên, Set-ExecutionPolicy Unrestriced là trên cơ sở mỗi người dùng và cơ sở mỗi bit (32 bit khác với 64 bit).

Thứ hai, bạn có thể ghi đè chính sách thực thi từ dòng lệnh.

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() 

Rõ ràng bạn có thể truy cập vào PowerShell 64-bit từ 32-bit PowerShell với con đường này (nhờ @eryksun trong ý kiến):

powershell64 = os.path.join(os.environ['SystemRoot'], 
    'SysNative' if platform.architecture()[0] == '32bit' else 'System32', 
    'WindowsPowerShell', 'v1.0', 'powershell.exe') 
+2

Thật tuyệt vời, cảm ơn bạn! Trên thực tế, tôi đã chỉ ra rằng vấn đề là do sự chuyển hướng hệ thống tập tin khét tiếng của Windows 7 x64. (Tôi đã có chính sách không hạn chế trong phiên bản x64, nhưng không phải trong x86, và python không chuyển hướng đến nó). –

+0

Tôi không hoàn toàn chắc chắn làm thế nào để gọi một thực thi như vậy với subprocess, nhưng chỉ để làm rõ, là './buildxml.ps1' lệnh thực tế đang được gọi là? –

+0

@ ai đó hoặc khác buildxml.ps1 là một tập tin kịch bản PowerShell và thực thi (nếu đó là những gì bạn có nghĩa là bằng lệnh) là '' C: \ WINDOWS \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe''. Tất cả các mục trong danh sách theo sau là các tham số được truyền cho tệp thực thi này. –

0

Đối với những người trong chúng ta, những người muốn biết làm thế nào để hiển thị các giá trị của arg1, arg2 và arg3 sau khi nó được chuyển đến powershell, tất cả những gì bạn cần làm là:

Write-Host $args[0] 
Write-Host $args[1] 
Write-Host $args[2] 
Các vấn đề liên quan