【问题标题】:Issue with batch script with vbscript command in the batch file批处理文件中带有 vbscript 命令的批处理脚本问题
【发布时间】:2015-09-12 04:56:35
【问题描述】:

我是批处理脚本和 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 得到了这段代码,我已经尝试了前 2 个答案(两者都不需要下载任何东西)。

    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

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

【问题讨论】:

    标签: windows excel csv batch-file vbscript


    【解决方案1】:

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

    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
    

    【讨论】:

    • strNewName = Left(objFile.Path, Len(objFile.Path) - 4) 是否总是可靠的?似乎从每个新名称中减去 4 可能会带来一些问题。另外,我如何将每个新的 .csv 文件更改为与父文件夹名称相同的名称?
    • 前一行检查文件名是否以.xlsx结尾,所以应该很可靠。您将如何使用父文件夹名称?如果两个 XLSX 文件存在于同一个子文件夹中怎么办?他们最终不会为 CSV 使用相同的父文件夹名称吗?
    • 糟糕,我真正需要的是将每个文件夹中的所有新 .csv 文件合并到一个具有文件夹名称的文件中。例如创建了 file1.csv、file2.csv,它们都在 subfolder1 中。将创建一个包含 file1 和 file2 内容的新 .csv 文件,称为 subfolder1.csv。
    • 有多种方法可以合并 CSV 文件。由于它们只是文本文件,您可以将它们 copy 到同一个目标文件,Windows 将合并它们。但这超出了您最初问题的范围。如果您不知道如何通过 Google/SO 执行此操作,请继续提交一个针对 CSV 合并的新问题。
    【解决方案2】:

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

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

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

    您正在将字符串 "*.CSV" 传递给无法运行的脚本,%%~dpna.csv 采用 %%a 中的文件名并将扩展名更改为 .CSV

    引号是为了在路径中留出空格。

    【讨论】:

    • 感谢您的帮助!!这对我来说实际上很有意义,而且现在运行良好。有没有办法将 .csv 文件更改为父目录的名称?例如,如果路径是 subfolder1\file1.xlsx,如果我想将新的 .csv 文件重命名为 subfolder1,我该怎么做?
    猜你喜欢
    • 2013-11-11
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多