Batch file 使用VBA从网络调用批处理文件

Batch file 使用VBA从网络调用批处理文件,batch-file,ms-access,vba,Batch File,Ms Access,Vba,我有一个access数据库,我想完全从其他用户的共享驱动器运行,并将VBA写入前端表单 作为其功能之一,它使用VBA调用批处理文件,将其他文件压缩为文本文件,然后链接并导入数据库 但是,由于将数据库与批处理文件一起移动到共享驱动器上,因此无法找到批处理文件,因为CMD表示不支持UNC路径。另外,理想情况下,我希望VBA在继续使用VBA之前等待批处理文件完成,因为我目前有另一个函数使代码等待设定的时间量(WaitFor(10)) CMD声明“U:\My”不被识别为内部或外部命令。这是在VBA编码中

我有一个access数据库,我想完全从其他用户的共享驱动器运行,并将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"

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

如果您有空间,您需要报价:

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:
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)


我通过阅读微软网站()解决了这个问题。因此,我用
Dim-UtilShell
UtilShell=Shell(batpath&“D0301.bat”,vbHide)替换了
调用Shell(Environ$(“COMSPEC”)&“/c”&batpath和“myBat.bat”,vbNormalFocus)
,我通过阅读微软网站()解决了这个问题。因此,我用
Dim-UtilShell
UtilShell=Shell(batpath&“D0301.bat”,vbHide)替换了
callshell(environo$(“COMSPEC”)&“/c”&batpath&“myBat.bat”,vbNormalFocus)
!谢谢你的建议。我已经在文件路径周围添加了“”,并在复制目标中添加了““U:\…”,但是我仍然在CMD中收到相同的消息,批处理文件没有运行。我猜它可能再次找不到.bat.Hi Gustav!我在Chr(34)中添加了进入你给我的那一行,但CMD仍在将路径切割为路径的根和第一个字:(可能您需要
batpath
来保存驱动器和文件夹。错误到底会出现在哪里?嗨,古斯塔夫!VBA中的错误实际上发生在
DoCmd.TransferText acLinkDelim
的行开头,但这是因为它找不到批处理文件应该创建的文件,并且会出错。我认为这是因为从
Application.CurrentProject.Path
及其下一个文件夹中创建了
batpath
,它将包含文件的完整路径,而不是文件名本身。是否还需要添加批处理文件名和扩展名?然后插入
Debug.Print
,如上图所示,并仔细研究输出,查看是否匹配es创建文件的名称。嗨,古斯塔夫!谢谢你的建议。我已经在文件路径周围添加了“”,并在复制目标中添加了“`”U:\…`,但是我仍然在CMD中收到相同的消息,批处理文件没有运行。我猜它可能再也找不到.bat.Hi古斯塔夫了!我在Chr(34)中添加了进入你给我的那一行,但CMD仍在将路径切割为路径的根和第一个字:(可能您需要
batpath
来保存驱动器和文件夹。错误到底会出现在哪里?嗨,古斯塔夫!VBA中的错误实际上发生在
DoCmd.TransferText acLinkDelim
的行开头,但这是因为它找不到批处理文件应该创建的文件,并且会出错。我认为这是因为从
Application.CurrentProject.Path
及其下一个文件夹中创建了
batpath
,它将包含文件的完整路径,而不是文件名本身。是否还需要添加批处理文件名和扩展名?然后插入
Debug.Print
,如上图所示,并仔细研究输出,查看是否匹配设置所创建文件的名称。不能在UNC路径上使用CD命令;如果需要更改active directory,可以将UNC路径装载到驱动器号并以这种方式访问它。如果可以将基本UNC路径放入变量中,则可以使用该变量构建批处理文件中每个对象的完整路径。您好!这可以解释为什么y我无法调用它,只是一直收到相同的错误消息。实际上,我将
调用Shell(…
更改为
变量=Shell(…
这似乎有效。当通过shell命令传递包含空格的路径时,需要确保参数中包含的路径周围有引号。使用chr(34)可以向参数中添加引号字符,以便命令行解释器将其视为单个参数。如果我有更多时间,我可以为vbs和cmd部分编写一个完整的示例。不能在UNC路径上使用CD命令;如果需要更改活动的di,可以将UNC路径装载到驱动器号并以这种方式访问它目录。如果可以将基本UNC路径放入变量中,则可以使用该路径来构建批处理文件中每个对象的完整路径。嗨,CoveGeek!这就解释了为什么我无法调用它并一直收到相同的错误消息。实际上,我将
调用Shell(…
更改为
variable=Shell(…
这似乎有效。当通过shell命令传递包含空格的路径时,需要确保参数中包含的路径周围有引号。使用chr(34)可以向参数添加引号字符,以便命令行解释器将其视为单个参数。如果我有更多时间,我可以为vbs和cmd部分编写完整的示例。