【问题标题】:Executing a vbs file with arguments created by python使用 python 创建的参数执行 vbs 文件
【发布时间】:2013-10-07 10:07:02
【问题描述】:

我想一次将几十个 excel 工作表转换为 csv 文件。我有一个可以进行转换的工作 .vbs 文件,我想借助 python 代码在不同的工作表上执行这个 .vbs 文件。我有以下 2 个版本的 python 代码:

版本 1:

import os
import sys
import subprocess

FolderName=sys.argv[1]
FileList=os.listdir(FolderName)
NewList=[]

for i in FileList:
   NewItem=i.split('.xls')
   NewXls=FolderName+"\\"+NewItem[0]+".xlsx "
   NewCsv=FolderName+"\\"+NewItem[0]+".csv"
   NewCommand="C:\\Users\\user\\XlsToCsv.vbs "+sys.argv[2]+" "+NewXls+NewCsv
   subprocess.call(NewCommand)

版本 2:

import os
import sys
import subprocess

def main(directory,extension,sheet):
 for filename in os.listdir(directory):
    if filename.endswith(extension):
        path = os.path.join(directory, filename)
        base = os.path.join(directory, filename[:len(filename)-len(extension)])
        print base
        new_xls = base + extension
        new_csv = base + '.csv'
        subprocess.call(['C:\\Users\\user\\XlsToCsv.vbs', sheet, new_xls, new_csv])

main(sys.argv[1],sys.argv[2],sys.argv[3])

没关系,我试哪个,我得到同样的错误信息:

 Traceback (most recent call last):
   File "C:/Users/user/Desktop/Work/XlsDir.py", line 16, in <module>
     subprocess.call(NewCommand)
   File "C:\Python27\lib\subprocess.py", line 524, in call
     return Popen(*popenargs, **kwargs).wait()
   File "C:\Python27\lib\subprocess.py", line 711, in __init__
     errread, errwrite)
   File "C:\Python27\lib\subprocess.py", line 948, in _execute_child
     startupinfo)
   WindowsError: [Error 193] %1 er ikke et gyldigt Win32-program

错误信息的最后一行大致意思是,它不是一个有效的 Win32 程序。

到目前为止我所尝试的:

  • 如果我使用正确的参数(工作表、.xls 文件的名称和 .csv 文件的名称)从命令提示符运行 .vbs 文件,那么它可以正常工作。
  • 如果我打印 python 生成的命令并将它们复制到命令提示符中,它们可以正常工作。
  • 我在不同的路径中尝试了 '\' 和 '\' 的所有组合,但没有比这更好的了。
  • 我尝试通过将 sys.argv[i] 参数替换为特定参数来执行程序,然后从命令提示符处执行 .py 文件。我收到同样的错误消息。

我希望你们中的一些人可以帮助我。非常感谢!

【问题讨论】:

  • :-) 两天后我找到了解决方案。 :-) 我不会删除我的问题,也许其他人会需要它。您必须将“wscript.exe”添加到 subprocess.call 参数... 'NewCommand="wscript.exe C:\\Users\\user\\XlsToCsv.vbs "+sys.argv[2]+" "+ NewXls+NewCsv"
  • 您是否尝试过使用不同的方式来运行您的命令,例如使用os.system?另外你可以看看那里:stackoverflow.com/questions/5538671/…也许它可以帮助你。

标签: python vbscript execute


【解决方案1】:

尝试使用cscript.exe 运行脚本:

subprocess.call(['cscript.exe', 'C:\\Users\\user\\XlsToCsv.vbs', sheet, new_xls, new_csv])

【讨论】:

  • 非常感谢 Ansgar,这确实是解决方案。 :-)
【解决方案2】:

详细说明 Ansgar 的补救措施:

从命令行“工作”启动 .vbs,因为 shell 将扩展名 .vbs 与应用程序相关联(例如 cscript/wscript;参见 ftype、assoc、cscript //E、cescript //S)。

subprocess.call() 不会打开 shell,所以要么指定应用程序 (c|wscript.exe),要么自己启动 shell:

import subprocess

#subprocess.call("notepad") # works

#subprocess.call("dir") # [Error 2] The system cannot find the file specified
                        # no shell, no intrinsics

#subprocess.call("19112944.vbs") # [Error 193] %1 is not a valid Win32 application
                                 # no shell, can't associate .vbs with c|wscript.exe

subprocess.call("cscript 19112944.vbs") # works

subprocess.call("cmd /c 19112944.vbs") # works
                                       # have shell, can associate .vbs with c|wscript.exe

【讨论】:

  • 非常感谢 Ekkehard,这正是我想要得到的答案。
  • 有没有办法在命令行界面之外使用由 python 创建的参数来执行 vbs 文件?
  • 理论上你可以使用 comtypes (pypi.python.org/pypi/comtypes) 来 .CreateObject() 一个 MSScriptControl (msdn.microsoft.com/en-us/library/aa227633(v=vs.60).aspx); .AddCode 一些 VBScript 代码和 .Run 带参数。实际上它是行不通的:没有下载,没有支持,只有 32 位。
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多