批处理文件中使用 vbscript 命令的批处理脚本问题
Issue with batch script with vbscript command in the batch file
我是批处理脚本和 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
我不确定是什么问题,目前我很困惑。
VBS需要和BAT文件在同一个目录下。
问题是 FOR
循环中的变量扩展规则意味着 filename
不会被设置为当前文件变量值;只需使用 %%a
代替:
FOR /r %%a in (*.xlsx) do (
ExceltoCSV.vbs "%%a" "%%~dpna.csv"
)
您正在将字符串 "*.CSV"
传递给脚本,该脚本不起作用,%%~dpna.csv
采用 %%a
中的文件名并将扩展名更改为 .CSV
。
引号是为了让路径中有空格。
您正在使用 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
我是批处理脚本和 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
我不确定是什么问题,目前我很困惑。
VBS需要和BAT文件在同一个目录下。
问题是 FOR
循环中的变量扩展规则意味着 filename
不会被设置为当前文件变量值;只需使用 %%a
代替:
FOR /r %%a in (*.xlsx) do (
ExceltoCSV.vbs "%%a" "%%~dpna.csv"
)
您正在将字符串 "*.CSV"
传递给脚本,该脚本不起作用,%%~dpna.csv
采用 %%a
中的文件名并将扩展名更改为 .CSV
。
引号是为了让路径中有空格。
您正在使用 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