批处理脚本与批处理文件中的vbscript命令一起出现问题

时间:2015-06-25 14:10:52

标签: windows excel csv batch-file vbscript

我是批处理脚本和vbscript的新手。我想要做的是将.xlsx Excel文件转换为.csv Excel文件,在多个目录中(递归)。例如:

Main directory
   subdirectory1
      file1.xlsx
      file2.xlsx
   subdirectory2
      file3.xlsx
      file4.xlsx

我制作了这个批处理脚本:

FOR /r %%a in (*.xlsx) do (
    SET filename=%%a
    ExceltoCSV.vbs %filename% *.csv
)

for循环内部是ExceltoCSV.vbs。我从这个帖子Convert XLS to CSV on command line获得了这段代码,我已经尝试了前两个答案(两者都不需要下载任何内容)。

    if WScript.Arguments.Count < 2 Then
    WScript.Echo "Error! Please specify the source path and the destination. Usage: XlsToCsv SourcePath.xls Destination.csv"
    Wscript.Quit
End If
Dim oExcel
Set oExcel = CreateObject("Excel.Application")
Dim oBook
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))
oBook.SaveAs WScript.Arguments.Item(1), 6
oBook.Close False
oExcel.Quit
WScript.Echo "Done"

错误是说无法访问ExceltoCSV.vbs文件。但是,我相信批处理脚本正在运行,例如它会说:

SET filename=C:\folder\subfolder\test1.xlsx

然后它调用:

ExceltoCSV.vbs C:\folder\subfolder\test1.xlsx *.csv

我不确定问题是什么,目前我很困惑。

2 个答案:

答案 0 :(得分:1)

VBS需要与BAT文件位于同一目录中。

问题是FOR循环中的变量扩展规则意味着filename不会被设置为当前文件变量值;只需使用%%a代替:

FOR /r %%a in (*.xlsx) do (
   ExceltoCSV.vbs "%%a" "%%~dpna.csv"
)

您正在将字符串"*.CSV"传递给无效的脚本,%%~dpna.csv%%a中的文件名更改为.CSV

引号用于允许路径中的空格。

答案 1 :(得分:0)

您正在使用VBScript进行转换。为什么不用它来迭代你的文件夹呢?那么你不必担心从BAT调用VBS并传递正确的args。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oExcel = CreateObject("Excel.Application")
DoFolder "c:\mainfolder"
oExcel.Quit

Sub DoFolder(strFolder)

    ' Recursively process each subfolder...
    For Each objSubFolder In objFSO.GetFolder(strFolder).SubFolders
        DoFolder objSubFolder.Path
    Next

    ' Convert any XLSX files...
    For Each objFile In objFSO.GetFolder(strFolder).Files
        If StrComp(objFSO.GetExtensionName(objFile.Name), "xlsx", vbTextCompare) = 0 Then

            strNewName = Left(objFile.Path, Len(objFile.Path) - 4) & "csv"

            ' Convert...
            Set oBook = oExcel.Workbooks.Open(objFile.Path)
            oBook.SaveAs strNewName, 6
            oBook.Close False

        End If            
    Next

End Sub