【问题标题】:Calling batch file from Network using VBA使用 VBA 从网络调用批处理文件
【发布时间】:2016-02-04 09:31:47
【问题描述】:

我有一个访问数据库,我想完全从共享驱动器为其他用户运行,并将 VBA 写入前端表单。

作为其中一个功能的一部分,它调用一个批处理文件,使用 VBA 将其他文件压缩成一个文本文件,然后将其链接并导入数据库。

但是,由于将数据库连同批处理文件一起移动到共享驱动器上,它无法找到批处理文件,因为 CMD 表示不支持 UNC 路径。理想情况下,我希望 VBA 在继续使用 VBA 之前等待批处理文件完成,因为我目前有另一个函数可以让代码等待一段时间(WaitFor(10))。

CMD 声称“U:\My”未被识别为内部或外部命令。这是在 VBA 编码还是批处理文件中?

相关代码:

Dim txtPath, batpath, FormDate, tempPath As String

FormDate = Format(Now(), "yyyymmdd")
batpath = Application.CurrentProject.Path & "\Compressor\"
txtPath = Application.CurrentProject.Path & "\Data_TextFile\"
tempPath = Application.CurrentProject.Path & "\TempTextFlows\"

'Do files exist in temp folder?
If Dir(tempPath & "*.*") = "" Then

    'If files don't exist change status to:
  Me.Text41 = "No File(s) Found"
  Else

   'If files do exist change status to:
  Me.Text41 = "Compressing Files, Please Wait..."

   'Call the Files compressor
  Call Shell(Environ$("COMSPEC") & " /c " & batpath & "myBat.bat", vbNormalFocus)

   'Wait 5 seconds for flow compressor to run
  Call WaitFor(10)

   'Link text file created by flow compressor using "TextFile_" and todays date
  DoCmd.TransferText acLinkDelim, "TextFile20160126 Link Specification", _
 "TextFile_" & FormDate, txtPath & "TextFile_" & FormDate & ".txt"

   'Format recently linked FormatTextFlows into tables
  Call FormatTextFlows
  Me.Text41 = "Files Completed"

End If

下面是它调用的批处理文件:

U:
cd "My Folder\test\FormatTextFlows\TempTextFlows"

echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,4%
echo.
echo Timestamp = %date:~6,4%-%date:~3,2%-%date:~0,2%

copy *.USR "My Folder\test\FormatTextFlows\Data_TextFile\TextFile_%date:~6,4%%date:~3,2%%date:~0,2%.txt"

提前感谢任何人提供的任何帮助。

【问题讨论】:

  • 您不能在 UNC 路径上使用 CD 命令;如果需要更改活动目录,您可以将 UNC 路径挂载到驱动器号并以这种方式访问​​它。如果您可以将基本 UNC 路径放入变量中,那么您可以使用它来构建批处理文件中每个对象的完整路径。
  • 嗨 CoveGeek!这可以解释为什么我不能调用它并且只是不断收到相同的错误消息。我实际上将Call Shell(... 更改为Variable = Shell(...,这似乎有效。
  • 当你通过shell命令传递一个包含空格的路径时,你需要确保参数中包含的路径有引号。使用 chr(34) 可以在参数中添加引号字符,以便命令行解释器将其视为单个参数。如果我有更多时间,我可以为 vbs 和 cmd 部分编写一个完整的示例。

标签: batch-file ms-access vba


【解决方案1】:

当你有空格时,你需要引号:

U:
cd "My Folder\test\FormatTextFlows\TempTextFlows"

但是使用这个,我猜应该是这样的:

copy *.USR "U:\My Folder\test\FormatTextFlows\Data_TextFile\TextFile_%date:~6,4%%date:~3,2%%date:~0,2%.txt"

您可能还需要在 Shell 命令中使用引号:

Call Shell(Environ$("COMSPEC") & " /c " & Chr(34) & batpath & "myBat.bat" & Chr(34), vbNormalFocus)

调试:

'Link text file created by flow compressor using "TextFile_" and todays date
Debug.Print "TextFile20160126 Link Specification", _
"TextFile_" & FormDate, txtPath & "TextFile_" & FormDate & ".txt"
DoCmd.TransferText acLinkDelim, "TextFile20160126 Link Specification", _
"TextFile_" & FormDate, txtPath & "TextFile_" & FormDate & ".txt"

检查 Shell 调用:

Debug.Print Environ$("COMSPEC") & " /c " & Chr(34) & batpath & "myBat.bat" & Chr(34)
Call Shell(Environ$("COMSPEC") & " /c " & Chr(34) & batpath & "myBat.bat" & Chr(34), vbNormalFocus)

【讨论】:

  • 嗨古斯塔夫!感谢您的建议。我已经在文件路径周围添加了“”,并在复制目标的“U:\...”中添加了,但我仍然在 CMD 中收到相同的消息并且批处理文件没有运行。我我猜然后它找不到.bat。
  • 您好,古斯塔夫!我在 Chr(34) 中添加了您给我的行,但 CMD 仍在将路径缩减为路径的根和第一个单词:(
  • 也许您需要batpath 来保存驱动器和文件夹。错误究竟出现在哪里?
  • 嗨古斯塔夫! VBA 中的错误实际上发生在以DoCmd.TransferText acLinkDelim 开头的行上,但这是因为它找不到应该由批处理文件创建的文件,并且出错了。我认为因为我从Application.CurrentProject.Path 及其下一个文件夹创建了batpath,所以它将包含文件的完整路径,而不是文件名本身。批处理文件名和扩展名也需要加吗?
  • 然后插入Debug.Print如上图,仔细研究输出,看是否与创建的文件名匹配。
【解决方案2】:

我通过阅读微软网站 (https://support.office.com/en-us/article/shell-function-ff2e4b1b-712d-4e34-aea6-6832eadd3c63) 设法解决了这个问题。所以我用Dim UtilShellUtilShell = Shell(batpath & "D0301.bat", vbHide)替换了Call Shell(Environ$("COMSPEC") & " /c " & batpath & "myBat.bat", vbNormalFocus)这一行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2011-09-15
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多