【问题标题】:Running PowerShell Script from Python从 Python 运行 PowerShell 脚本
【发布时间】:2019-12-02 22:20:38
【问题描述】:

我正在尝试运行 Powershell 脚本(请查看下方) 首先要说的是,我的 Powershell 脚本在使用 Powershell 运行时工作正常,给出了预期的结果(关闭所有打开的文件夹),但我必须从 Python 脚本中调用它,因此我尝试使用 subprocess.Popen,但我有错误 : "io.UnsupportedOperation: fileno"

已经尝试了几种不同的方法,但建议的解决方案不起作用。

我正在尝试调用以下 Powershell 脚本:

$shell = New-Object -ComObject Shell.Application 
$shell.Windows() | Format-Table LocationName, LocationURL 
$window = $shell.Windows() 
$window | ForEach-Object { $_.Quit() }

想法是关闭所有打开的文件夹,直接用Powershell运行就可以了。

然后我尝试从 Python 调用这个脚本:

p = subprocess.Popen(['powershell.exe', 'C:\\Users\\(correct subfolders)\\TEST.ps1'])

p = subprocess.Popen(['C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', 'C:\\Users\\(correct subfolders)\\TEST.ps1'])

并且它们不返回错误,打开一个 cmd 窗口,但没有任何反应。 然后我尝试了以下方法:

p = subprocess.Popen(['powershell.exe', 'C:\\Users\\(correct subfolders)\\TEST.ps1'], stdout=sys.stdout)

但我有以下错误(检查下方)

File "<pyshell#15>", line 1, in <module>
    p = subprocess.Popen(['powershell.exe', 'C:\\Users\\FernanP\\Desktop\\TEST.ps1'], stdout=sys.stdout)
  File "C:\Users\FernanP\AppData\Local\Programs\Python\Python36-32\lib\subprocess.py", line 667, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
  File "C:\Users\FernanP\AppData\Local\Programs\Python\Python36-32\lib\subprocess.py", line 922, in _get_handles
    c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
io.UnsupportedOperation: fileno

我在这里查看了类似的问题,人们说 Pillow 版本,但我目前使用的是 6.1.0,所以应该没有问题。

因此,直接在 Python 中等效于 powershell 脚本就足够了,或者是一种处理此问题的方法。 希望我充分告知。 韩国

【问题讨论】:

    标签: python powershell subprocess


    【解决方案1】:

    你可以使用subprocess.run,需要PIPEshell。以下代码对我有用:

    import subprocess
    result = subprocess.run([r'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe', r'C:\Users\(correct subfolders)\TEST.ps1'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
    print(result)
    

    打印结果可以给你返回值,就像命令成功执行一样。如果要提取result的值,可以这样做,

    print(result.stdout.decode('utf-8'))
    

    【讨论】:

    • 感谢您的帮助,确实我不再有错误了,因此该部分已修复。但是....它什么都不做...当我用右键“用powershell运行”单击powershell脚本时它才起作用。不知道为什么
    • @aranhaplf 我使用了与您选择 man 的解决方案相同的功能!
    【解决方案2】:

    在这里我创建了自己的function 运行任何 powershell scriptits parameters

    import subprocess  # IMPORT FOR SUB PROCESS . RUN METHOD
    
    POWERSHELL_PATH = "powershell.exe"  # POWERSHELL EXE PATH
    ps_script_path = "C:\\PowershellScripts\\FTP_UPLOAD.PS1"  # YOUR POWERSHELL FILE PATH
    
    
    class Utility:  # SHARED CLASS TO USE IN OUR PROJECT
    
        @staticmethod    # STATIC METHOD DEFINITION
        def run_ftp_upload_powershell_script(script_path, *params):  # SCRIPT PATH = POWERSHELL SCRIPT PATH,  PARAM = POWERSHELL SCRIPT PARAMETERS ( IF ANY )
    
            commandline_options = [POWERSHELL_PATH, '-ExecutionPolicy', 'Unrestricted', script_path]  # ADD POWERSHELL EXE AND EXECUTION POLICY TO COMMAND VARIABLE
            for param in params:  # LOOP FOR EACH PARAMETER FROM ARRAY
                commandline_options.append("'" + param + "'")  # APPEND YOUR FOR POWERSHELL SCRIPT
    
            process_result = subprocess.run(commandline_options, stdout = subprocess.PIPE, stderr = subprocess.PIPE, universal_newlines = True)  # CALL PROCESS
    
            print(process_result.returncode)  # PRINT RETURN CODE OF PROCESS  0 = SUCCESS, NON-ZERO = FAIL  
            print(process_result.stdout)      # PRINT STANDARD OUTPUT FROM POWERSHELL
            print(process_result.stderr)      # PRINT STANDARD ERROR FROM POWERSHELL ( IF ANY OTHERWISE ITS NULL|NONE )
    
            if process_result.returncode == 0:  # COMPARING RESULT
                Message = "Success !"
            else:
                Message = "Error Occurred !"
    
            return Message  # RETURN MESSAGE
    

    【讨论】:

    • 感谢您的帮助,确实我不再有错误了,因此该部分已修复。但是....它什么都不做...当我使用右键“使用 powershell 运行”单击 powershell 脚本时,它只会起作用(删除打开的文件夹)。
    • 最后只能使用“commandline_options”来运行,感谢您的帮助!
    • 在我意识到如何使用它之后,这对我有用。由于这是一个类,您需要从另一个脚本导入/调用它,或者您可以将以下脚本添加到此脚本的末尾以直接查看响应:``` if name == "main": response = Utility.run_ftp_upload_powershell_script(ps_script_path) print(response) ``
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2018-08-12
    • 2012-07-13
    相关资源
    最近更新 更多