【问题标题】:How to I include a vbscript step in a batch file?如何在批处理文件中包含 vbscript 步骤?
【发布时间】:2018-10-12 21:13:10
【问题描述】:

我正在尝试做的事情: 我有 3 个 xls 文件,我通过电子邮件收到,名称如下(每次都更改日期戳):

CDC aaa 01 01 2018.xls
CDC bbb 01 01 2018.xls
CDC ccc 01 01 2018.xls

我想:

  • 将它们转换为 csv
  • 将它们命名为:aaa.csv、bbb.csv、ccc.csv

这是我的脚本,到目前为止,失败了:

@ECHO OFF
setlocal enableextensions enabledelayedexpansion


for %%F in ("*.xls") do ( 
    REM get filename only
    set tmp=%%~F

    REM look for aaa
    echo.!tmp! | findstr /i "aaa" 1>nul
    if errorlevel 1 (
        echo. Not aaa.
    ) ELSE (
        echo. Found aaa
        set fileout=aaa.csv
    )

    REM look for bbb
    echo.!tmp! | findstr /i "bbb" 1>nul
    if errorlevel 1 (
        echo. Not bbb.
    ) ELSE (
        echo. Found bbb.
        set fileout=bbb.csv
    )

    REM look for ccc
    echo.!tmp! | findstr /i "ccc" 1>nul
    if errorlevel 1 (
        echo. Not ccc.
    ) ELSE (
        echo. Found ccc.
        set fileout=ccc.csv
    )
    REM convert and rename file
    xlstocsv.vbs "!tmp!" "!fileout!"
)

当我运行它时,我收到 Windows Script Host 错误消息:

Script: C:\[bla]\xlstocsv.vbs
Line: 17
Char: 1
Error: The file could not be accessed. Try one of the following:
- Make sure folder exists
- Make sure the folder that contains the file is not read-only
- Make sure the file name does not contain anu of the following characters: < > ? [ ] : CDC aaa 01 01 2018.xls or *
- Make sure the file/path name doesn't contain more than 218 characters
- Code: 800A03EC
- Source: Microsoft Excel

我可以确认文件/文件夹不是只读的,我可以确认路径/文件名中没有特殊字符,路径也不超过 218 个字符。

我还可以确认 excel 文件没有任何损坏或损坏。

我也可以说,当我看到错误消息时,如果我尝试在 excel 中打开 3 个文件中的任何一个(不仅仅是我得到错误的那个),excel 会抛出与上述完全相同的错误。

如果我运行这个脚本,它就可以正常工作:

setlocal enableextensions enabledelayedexpansion

for %%F in ("*.xls") do ( 
    xlstocsv.vbs "%%~nF.xls" "%%~nF.csv"
)

但此版本的脚本不会将我的文件重命名为所需的文件名,只是更改了扩展名。

这是 VBScript:

if WScript.Arguments.Count < 2 Then
    WScript.Echo "Please specify the source and the destination files. Usage: ExcelToCsv <xls/xlsx source file> <csv destination file>"
    Wscript.Quit
End If

csv_format = 6

Set objFSO = CreateObject("Scripting.FileSystemObject")

src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))

Dim oExcel
Set oExcel = CreateObject("Excel.Application")

Dim oBook
Set oBook = oExcel.Workbooks.Open(src_file)

oBook.SaveAs dest_file, csv_format

oBook.Close False
oExcel.Quit

【问题讨论】:

  • 只需在 xlstocsv.vbs 之前添加 cscript
  • 如果有多个以ABC 开头的.xls 文件会怎样?如果肯定不能超过一个,为什么不使用("ABC*.xls")此时无需设置tmp 变量或进行If 比较,您可以使用类似:For %%F In ("ABC*.xls") Do CScript //B //NoLogo xlsToCSV.vbs "%%F" ABC.csv
  • @RegisDesrosiers 我将最后一行更改为 "cscript xlstocsv.vbs ..." 但它不起作用:xlstocsv.vbs(17, 1) Microsoft Excel:无法访问该文件.尝试以下方法之一:[bla bla]。由于我猜是循环,文件被“锁定”了。
  • @SergiuZ,如果您只有三个文件,并且每周只需要处理两次,那么在此期间不打开它们或确保它们之前没有使用过有多难?您是否考虑过复制文件并处理副本?为什么要针对特定​​问题使用通用示例? 你真的认为有人可以通过知道这些文件名来窃取公司信息吗? 另外,如果只有三个文件,为什么你不知道它们的名字? 然后您可以只在三行上运行转换命令,而不是使用通配符循环!
  • 问题的最可能原因是 VBScripts 默认使用wscript.exe 运行,它异步运行(即,当程序继续在后台运行时调用立即返回)。使用cscript.exe 作为第一条评论建议避免这种情况。其他可能的问题是 VBScript 没有正确关闭文件或后台 Excel 实例使其保持打开状态,但为了进行故障排除,我们需要查看 VBScript 代码。

标签: windows batch-file cmd vbscript


【解决方案1】:

鉴于提供的文件命名结构,以下脚本应执行所需的任务:

@Echo Off
Set "Ext1=.xls"
Set "Ext2=.csv"
Set "ScrV=C:\bla\xlsToCSV.vbs"
Set "SrcD=C:\bla\bla"
Set "Str1=aaa"
Set "Str2=bbb"
Set "Str3=ccc"

CD /D "%SrcD%" 2>Nul || Exit /B
For %%A In ("?* %Str1% ?*%Ext1%","?* %Str2% ?*%Ext1%","?* %Str3% ?*%Ext1%") Do (
    For /F "Tokens=2" %%B In ("%%~nA") Do (Echo Found %%B
        CScript //B //NoLogo "%ScrV%" "%%A" "%%B%Ext2%"))

您应该只更改4-8 行,插入适当的路径和字符串。 (请不要在5 行的源目录路径中添加或删除任何双引号",并且不要在您的源目录路径中包含尾部反斜杠\。)

这只是一个批处理脚本解决方案、VBScript Excel 或文件系统问题需要一个新问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2018-11-22
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多