使用Python创建的参数执行vbs文件
使用Python创建的参数执行vbs文件
我想一次将几十个Excel表格转换为CSV文件。我有一个工作的.vbs文件可以进行转换,我想通过Python代码来执行这个.vbs文件来处理不同的表格。我有以下两个版本的Python代码:\n版本1:\n
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)
\n版本2:\n
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])
\n无论我尝试哪个版本,都会出现相同的错误信息:\n
Traceback (most recent call last): File "C:/Users/user/Desktop/Work/XlsDir.py", line 16, insubprocess.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
\n错误信息的最后一行大致意思是,这不是一个有效的Win32程序。\n我尝试过的方法:\n
- \n
- 如果我在命令提示符中使用正确的参数(sheet、.xls文件名和.csv文件名)运行.vbs文件,它可以正常工作。
- 如果我打印Python生成的命令并将其复制到命令提示符中,它们也可以正常工作。
- 我尝试了所有不同路径中\'\\\'和\'\\\'的组合,但没有任何改善。
- 我试图用具体的参数替换sys.argv[i]参数并从命令提示符中执行.py文件。我得到了相同的错误信息。
\n
\n
\n
\n
\n希望能有人能帮助我。非常感谢!
问题的原因是需要使用Python执行一个带有参数的vbs文件。解决方法是使用subprocess模块中的call方法来调用cscript.exe运行vbs文件,并传递参数。
具体代码如下:
import subprocess sheet = 'Sheet1' new_xls = 'C:\\Users\\user\\new.xls' new_csv = 'C:\\Users\\user\\new.csv' subprocess.call(['cscript.exe', 'C:\\Users\\user\\XlsToCsv.vbs', sheet, new_xls, new_csv])
这段代码中,subprocess.call方法接收一个列表参数,列表的第一个元素是cscript.exe,表示使用cscript.exe来执行vbs文件。列表的后续元素是vbs文件的路径和需要传递的参数。
通过使用cscript.exe来运行vbs文件,并传递参数,可以解决执行带有参数的vbs文件的问题。
问题出现的原因是subprocess.call()函数无法打开一个shell,所以无法关联.vbs扩展名的应用程序。解决方法是要么指定应用程序(例如cscript/wscript),要么手动启动shell。
以下是解决问题的代码示例:
import subprocess # 使用cscript运行.vbs文件 subprocess.call("cscript 19112944.vbs") # 正常工作 # 使用cmd命令运行.vbs文件 subprocess.call("cmd /c 19112944.vbs") # 正常工作
另一种理论上的解决方法是使用comtypes库的.CreateObject()方法创建一个MSScriptControl对象,然后使用.AddCode()方法添加一些VBScript代码,并使用.Run()方法运行它们。然而,在实践中这种方法不起作用,因为comtypes库没有下载和支持,并且只支持32位系统。
感谢Ekkehard提供的回答。有没有一种方法可以在命令行界面之外使用Python创建的参数执行一个.vbs文件?