从Python将运行PowerShell脚本的.xls转换为.xlsb,错误:“无法对空值表达式调用方法”

2024-10-01 17:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从python运行PowerShell脚本以将.xls文件转换为.xlsb。通过循环浏览文件名列表。我遇到一个PowerShell错误“对于命令3(即cmd3),您无法在空值表达式上调用方法”,我不确定原因(这是我第一次使用python并运行PowerShell脚本)。尝试打开工作簿时遇到错误,但直接在PowerShell中运行该命令时,该命令似乎工作正常

代码:

import logging, os, shutil, itertools, time, pyxlsb, subprocess

# convert .xls to .xlsb and / transfer new terminology files
for i in itertools.islice(FileList, 0, 6, None):

    # define extension
    ext = '.xls'

    # define file path
    psPath = f'{downdir}' + f'\{i}'

    # define ps scripts
    def run(cmd):
        completed = subprocess.run(["powershell", "-Command", cmd], capture_output=True)
        return completed
    
    # ps script: open workbook
    cmd1 = "$xlExcel12 = 50"
    cmd2 = "$Excel = New-Object -Com Excel.Application"
    cmd3 = f"$WorkBook = $Excel.Workbooks.Open('{psPath}{ext}')"
    cmd4 = f"$WorkBook.SaveAs('{psPath}{ext}',$xlExcel12,[Type]::Missing, 
           [Type]::Missing,$false,$false,2)"
    cmd5 = "$Excel.Quit()"
    
    # ps script: delete.xls files
    cmd6 = f"Remove-Item '{psPath}{ext}'"
    

    run(cmd1)
    run(cmd2)
    run(cmd3)

    # change extension
    ext = '.xlsb'

    run(cmd4)
    run(cmd5)
    run(cmd6)

    # copy .xlsb files to terminology folder
    shutil.copy(i + ext, termdir)

错误:

Out[79]: CompletedProcess(args=['powershell', '-Command', "$WorkBook = > > $Excel.Workbooks.Open('C:\Users\Username\Downloads\SEND Terminology.xls')"], returncode=1, stdout=b'', stderr=b"You cannot call a method on a null-valued expression.\r\nAt line:1 char:1\r\n+ $WorkBook = $Excel.Workbooks.Open('C:\Username\User\Downloads\SEND Ter ...\r\n+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n + CategoryInfo : InvalidOperation: (:) [], RuntimeException\r\n + FullyQualifiedErrorId : InvokeMethodOnNull\r\n \r\n")

任何意见都会有帮助

谢谢大家!


Tags: run命令错误filesxlsexcelextps
1条回答
网友
1楼 · 发布于 2024-10-01 17:24:00

问题

正如commentervonPryz正确指出的那样,Powershell命令在单独的进程中运行。进程的内存空间彼此隔离,并在进程结束时被清除

在单独的Powershell进程中运行命令时,cmd3cmd4cmd5将无法使用变量$Excel。对于不存在的变量,Powershell默认为$null值,因此会显示错误消息“您无法对空值表达式调用方法”。变量$xlExcel12也会发生同样的情况。这些变量仅在创建它们的进程运行时存在,并且仅在这些进程中可见,即使您设法并行创建了两个进程

解决方案

命令cmd1..5需要在同一Powershell进程中运行,因此每个命令都能够“查看”由以前的命令创建的变量:

run( cmd1 + ';' + cmd2 + ';' + cmd3 + ';' + cmd4 + ';' + cmd5 )

您需要更改cmd4以使用另一个变量作为将用于保存的扩展名,例如。gextSave

cmd4 = f"$WorkBook.SaveAs('{psPath}{extSave}',$xlExcel12,[Type]::Missing, 
       [Type]::Missing,$false,$false,2)"    

cmd6是完全独立的,因为它不依赖于Powershell变量。它只依赖于python变量,这些变量在流程开始之前就已解析,因此它仍然可以在单独的流程中运行

相关问题 更多 >

    热门问题