脚本中ftp -ui
介绍。许多人问我是否可以从Access中控制外部过程。 通过外部流程,我说的是在Access外部运行脚本。 这将包括BAT,CMD和PowerShell脚本,甚至包括使用Windows的FTP.EXE命令行界面的FTP脚本。
这些脚本接口的功能很难加以限制。 但是,尤其是FTP.EXE,可以控制通过Internet向各种FTP站点发送和接收文件的控制。 大多数网站都是使用此界面更新的。 可以在Access中将其自动化。
这种脚本的我最喜欢的用途之一是升级项目的当前版本。 我会在启动时自动更新前端数据库,并且还提供了以后随时进行升级以防损坏的选项(不幸的是,某些Access数据库很容易出现)。
不过,对于本文,我将重点介绍FTP脚本。 如果我稍后在升级过程中发布另一个,则将其链接起来,但是附件中包含的代码可以同时执行以防任何人感兴趣。 如果您特别想要有关升级过程的文章,请PM我。 我获得的PM越多,我的优先级列表就会越高;-)
这就是我将在本文中解释的内容。 在同一主题领域中的另一个是
使用Scripts-CMD控制外部流程 。对于那些会更容易先看到此说明并在视频中显示的人,请访问
(视频)控制访问中的外部进程-FTP,然后可能会在阅读完此内容后获得完整说明。 总体概念。这个概念依赖于一个表,最简单的设计为:
表格= [ tblCMD ] Field Name Type PK (Compound)
Template Boolean #1
Type String(1) #2
LineNo Long #3
Cmd String(255)
在某些情况下,我在数据库升级CMD脚本期间遇到了问题,单行中的命令长度有可能超过允许的255个字符。
因此,在所附示例中,我使用两个字段[Cmd1]和[Cmd2]代替单个[Cmd]。
在处理要输入到脚本表中的数据时,要记住的一个非常重要的观点是,数据中具有可替换参数的能力带来了额外的优势。 否则,您可能只需要使用保存的脚本文件即可。 在我的示例中,我使用百分比(%)后跟两个字母字符来标记数据中要从代码中插入值的点。 FTP脚本的一个示例是%Ac,它用作帐户名。 升级CMD脚本使用了不同的方式,因此请避免混淆两者。 这是升级CMD脚本替换以及FTP脚本使用的值的列表。 替换参数与其相关变量具有相同的名称,除了%替换str。 所以,
代码中的strBa用于替换数据中%Ba的出现。 FTP脚本的替换参数是%FS (FTP服务器), %Ac (帐户名称)和%PW (密码)。下一步是为同一表中的特定脚本创建模板的更新副本。 由于[Template]值为False,因此可以识别此新数据。 更新内容是用所需的值替换前面提到的参数。 然后(通过查询)将此新数据(仅)导出到脚本文件。导出后,将删除该数据。 为了从数据正确创建脚本文件,需要导出规范。
完成所有操作并准备好脚本文件后,我们需要调用它。
示例数据。 表格= [ tblCMD ] Template Type Order Cmd Template Type Order Cmd
TRUE F 10 Open %FS FALSE F 10 Open FTP.AccessConsultantUK.co.uk
TRUE F 20 %Ac FALSE F 20 ACUKdemo
TRUE F 30 %PW FALSE F 30 PublicPW
TRUE F 40 binary FALSE F 40 binary
TRUE F 50 mkdir test FALSE F 50 mkdir test
TRUE F 60 cd test FALSE F 60 cd test
TRUE F 70 send ACLogo.JPG sent.file FALSE F 70 send ACLogo.JPG sent.file
TRUE F 80 dir FALSE F 80 dir
TRUE F 90 rename sent.file renamed.file FALSE F 90 rename sent.file renamed.file
TRUE F 100 dir FALSE F 100 dir
TRUE F 110 get renamed.file BackAgain.JPG FALSE F 110 get renamed.file BackAgain.JPG
TRUE F 120 delete renamed.file FALSE F 120 delete renamed.file
TRUE F 130 rmdir test FALSE F 130 rmdir test
TRUE F 140 dir FALSE F 140 dir
TRUE F 150 bye FALSE F 150 bye
注意
左边的数据是原始模板数据。
右边的数据是更新后的数据,这就是为创建实际脚本文件而导出的数据。
该脚本主要是为了说明FTP.EXE中提供的一些命令。 同一文件被移动并重命名以演示一些可能性。 要查看更多内容,请输入
在CMD命令行上输入FTP ,以启动FTP,然后键入? 有关可用命令的列表。 输入HELP {command}以查看任何特定命令的更多详细信息。 完成后,键入bye以终止FTP会话。 码。尽管我展示的某些代码行将引用我自己的一些例程,但这只是代码的一小部分,即使未显示代码,也应很清楚它的作用。 因此,我将展示和解释主要代码,并将整个数据库包括在附件中,以便在需要时可以探索其他任何例程。 如果需要,我的代码始终可以重复使用。 我唯一声称的是版权。 其他人可以自由使用和更改代码。
我先解释一下
MultiReplace()
是我的功能之一,它通过允许多对from和to替换而简单地扩展了VBA.Replace()
函数。
不过,我不在SQL中使用此功能,正如您在第16行至第19行中对Replace()
函数调用的笨拙用法的多次使用中所看到的。
这是替换参数的地方。
若要查看其效果,请在第41行上放置一个断点,并在代码中的该位置打印strSQL的值。
我已经包含了
SetStrings()
,但它基本上(在这里)用于获取运行项目的文件夹。
- 第10和11行设置了要使用的文件名。
- 第42和#43行清除了以前遗留的所有数据,然后使用刚准备好SQL添加新数据。
- 第44至#49行首先删除该文件(如果存在),然后将我们新准备的数据导出到该文件中。
如果文件扩展名不是TXT,或者至少它可以识别为文本,则DoCmd.TransferText()
失败。 因此,我们必须使用该名称创建文件,然后将其重命名。 - 第50和#51行安全地重命名该文件。
- 第52行清除了[tblCMD]中的新数据。
- 第53行到#58行提示用户。
- 第59行到第64行使用CMD.EXE的START命令执行FTP脚本文件。 它还使用
ShellWait()
过程,可以在ShellWait()Function中找到该过程。 这显然也包含在附件中。
有关CMD.EXE的帮助 ,请在CMD命令行上键入HELP CMD 。 如需使用START的帮助,请输入START /? 在CMD命令行上(请忽略它说“ title”是可选参数的位置,不是。不是这样,这对我来说浪费了数小时)。
在行尾使用&& PAUSE纯粹是出于演示目的。 当窗口关闭并返回到Access项目时,操作员可以在按键盘上的任何键之前查看发生的情况的日志。 - 注意 第60行使用单引号(')表示VBA字符串中的双引号(“)。尽管如此,这些行仍被修改为第62行的(正确)双引号。同一代码的一部分。
'TestFTP() creates and runs the script file to test FTP.
Public Function TestFTP() As Boolean
Dim strAccount As String, strFTPServer As String, strFile As String
Dim strTemp As String, strSQL As String, strMsg As String, strCmd As String
Dim dbVar As DAO.Database
On Error GoTo ErrorHandler
strMode = SwitchMode(strType:="Process")
Call SetStrings
strFile = strFo & "\SCRIPT.FTP"
strTemp = strFo & "\SCRIPTFTP.Txt"
'Before we go any further, and regardless of whether or not we run the
' script, let's clear away any existing copy of SCRIPTFTP.Txt.
' It's checked again immediately prior to being created.
If Exist(strTemp) Then Call KillFile(strTemp)
strCmd = "Replace(Nz([~C],''),'%FS','%sFS')"
strCmd = Replace("Replace(%C,'%Ac','%sAc')", "%C", strCmd)
strCmd = Replace("Replace(%C,'%PW','%sPW')", "%C", strCmd)
strCmd = MultiReplace(strCmd, "%sFS", conFTPServer _
, "%sAc", conFTPAccount _
, "%sPW", Scramble(conFTPPW))
strSQL = "INSERT INTO [tblCMD]%L" _
& " ( [Template]%L" _
& " , [Type]%L" _
& " , [Order]%L" _
& " , [Cmd1]%L" _
& " , [Cmd2])%L" _
& "SELECT False AS [Template]%L" _
& " , [Type]%L" _
& " , [Order]%L" _
& " , [C1] AS [Cmd1]%L" _
& " , Null AS [Cmd2]%L" _
& "FROM (SELECT [Type]%L" _
& " , [Order]%L" _
& " , %C1 AS [C1]%L" _
& " FROM [tblCMD]%L" _
& " WHERE ([Template])%L" _
& " AND ([Type]='F')) AS [qC]"
strSQL = MultiReplace(strSQL, "%C1", Replace(strCmd, "~C", "Cmd1") _
, "%L", vbNewLine)
Set dbVar = CurrentDb()
Call ClearTable(strTable:="tblCMD", strWhere:=conClearCMD)
Call dbVar.Execute(Query:=strSQL, Options:=dbFailOnError)
If Exist(strTemp) Then Call KillFile(strTemp)
Call DoCmd.TransferText(TransferType:=acExportDelim, _
SpecificationName:="FTP Spec", _
TableName:="qryFTP", _
FileName:=strTemp, _
HasFieldNames:=False)
If Exist(strFile) Then Call KillFile(strFile)
Name strTemp As strFile
Call ClearTable(strTable:="tblCMD", strWhere:=conClearCMD)
strMsg = Replace("Testing FTP script.%L%L" _
& "This process should be very quick (<10 seconds).%L" _
, "%L", vbNewLine)
Call MsgBox(Prompt:=strMsg, _
Buttons:=vbInformation Or vbOKOnly, _
TITLE:=CurrentProject.NAME)
strTemp = MultiReplace("CMD.EXE /T:1E /C " _
& "Start 'FTP Test' /D '%F' /MAX /WAIT /B " _
& "FTP.EXE -s:SCRIPT.FTP&&PAUSE" _
, "'", """" _
, "%F", strFo)
Call ShellWait(strCommand:=strTemp, intWinStyle:=vbMaximizedFocus)
If Exist(strFile) Then Call KillFile(strFile)
Call SwitchMode(strType:=strMode)
TestFTP = True
Exit Function
ErrorHandler:
If Exist(strFile) Then Call KillFile(strFile)
If Exist(strTemp) Then Call KillFile(strTemp)
Call ClearTable(strTable:="tblCMD", strWhere:=conClearCMD)
strMsg = MultiReplace("Error (%N) :%L%D%L%L" & _
"Unable to complete FTP Test", _
"%N", Err, _
"%D", Err.DESCRIPTION, _
"%L", vbNewLine)
Call MsgBox(Prompt:=strMsg, Buttons:=vbCritical Or vbOKOnly, TITLE:=strOr)
Call SwitchMode(strType:=strMode)
End Function
'SetStrings() prepares the global string variables strA, strB, strF & strO.
Public Sub SetStrings()
If strAc = "" Then
With CurrentProject
strAc = BareFolder(SysCmd(acSysCmdAccessDir)) & "\MSAccess.Exe"
strOr = .NAME
strFo = Left(.Path, 1)
If strFo >= "A" And strFo <= "Z" And strFo <> Left(CurDir, 1) Then _
Call ChDrive(Drive:=strFo)
strFo = BareFolder(.Path)
If BareFolder(CurDir) <> strFo Then Call ChDir(Path:=strFo)
End With
End If
End Sub
结论。
在Access中可以控制的内容几乎没有限制。 我包括一个
附件 ,可以提取到任何文件夹并运行。 附件使用外接程序工具栏来访问要测试的项目。 第一次运行时,它可能会立即升级您。 不用担心 升级版本完全相同,只是内部存储了更高的版本号。 使用外接程序工具栏测试FTP进程。 直到2016年6月,这应该对您完全一样。如果要在此之后使用它,只需在modRelease
模块中提供FTP服务器和凭据。
有关更改的代码行,请参见上方“ 总体概念”部分中的图片。
翻译自: https://bytes.com/topic/access/insights/966046-control-external-processes-using-scripts-ftp
脚本中ftp -ui