使用Python创建参数并执行vbs文件

9
我希望能够批量将数十个Excel表格转换为CSV文件。我已经有一个可行的 .vbs 文件可以完成转换,现在我想通过 Python 代码来执行这个 .vbs 文件以便对不同的表格进行转换。以下是我编写的两个 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程序。
我已经尝试过:
- 如果我使用正确的参数(sheet,.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" - Rieux
你尝试过使用不同的命令运行方式,比如使用os.system吗?此外,你可以查看这里:https://dev59.com/-m035IYBdhLWcg3wPdcS,可能会对你有所帮助。 - user2725093
2个回答

18

关于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。这正是我想要得到的答案。 - Rieux
有没有一种方法可以在命令行界面之外使用Python创建的参数执行vbs文件? - Mitrek
理论上,您可以使用comtypes(https://pypi.python.org/pypi/comtypes)来.CreateObject()一个MSScriptControl(https://msdn.microsoft.com/en-us/library/aa227633(v=vs.60).aspx); .AddCode一些VBScript代码并使用参数运行它。但实际上它不起作用:没有下载,没有支持,只有32位。 - Ekkehard.Horner

9
尝试使用cscript.exe运行该脚本:
subprocess.call(['cscript.exe', 'C:\\Users\\user\\XlsToCsv.vbs', sheet, new_xls, new_csv])

非常感谢Ansgar,这真的是解决方案。 :-) - Rieux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接