脚本中ftp -ui_使用脚本控制外部进程-FTP

脚本中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服务器和凭据。 有关更改的代码行,请参见上方“ 总体概念”部分中的图片。

附加图片
文件类型:jpg CEPReplacements.jpg (72.7 KB,4780视图)
文件类型:jpg CEPToolbar.JPG (12.9 KB,4657观看)
附加的文件
文件类型:zip ControlExternalProcesses.ZIP (1.60 MB,354视图)

翻译自: https://bytes.com/topic/access/insights/966046-control-external-processes-using-scripts-ftp

脚本中ftp -ui

您好,以下是根据您的要求编写的Windows10自动部署StableDiffusion的Bat脚本: ```bat @echo off set home=%cd% set python=%home%\python set git=%home%\git set stable_diffusion=%home%\stable-diffusion echo 正在检查Python安装情况... if not exist %python%\python.exe ( echo 未检测到Python,正在安装Python 3.10.9... mkdir %python% cd %python% curl -o python.msi https://www.python.org/ftp/python/3.10.9/python-3.10.9-amd64.exe start /wait python.msi /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 del python.msi echo Python安装完成! ) else ( echo 已检测到Python,正在检查更新... cd %python% curl -o current_version.txt https://www.python.org/ftp/python/3.10.9/python-3.10.9-amd64.exe for /f "delims=" %%a in (current_version.txt) do set current_version=%%a del current_version.txt for /f "tokens=2 delims=." %%a in ('python --version 2^>^&1') do set installed_version=%%a if %installed_version% LSS %current_version% ( echo 发现新版本Python,正在更新... curl -o python.msi https://www.python.org/ftp/python/3.10.9/python-3.10.9-amd64.exe start /wait python.msi /quiet InstallAllUsers=1 PrependPath=1 Include_test=0 del python.msi echo Python更新完成! ) else ( echo Python已是最新版本! ) ) echo. echo 正在检查Git安装情况... if not exist %git%\bin\git.exe ( echo 未检测到Git,正在安装Git 2.40.1... mkdir %git% cd %git% curl -o git.exe https://github.com/git-for-windows/git/releases/download/v2.40.1.windows.1/Git-2.40.1-64-bit.exe start /wait git.exe /VERYSILENT /NORESTART /SUPPRESSMSGBOXES /CLOSEAPPLICATIONS /SP- /RESTARTAPPLICATIONS /COMPONENTS="icons,ext\reg\shellhere,assoc,assoc_sh" del git.exe echo Git安装完成! ) else ( echo 已检测到Git,正在检查更新... cd %git% curl -o current_version.txt https://github.com/git-for-windows/git/releases/download/v2.40.1.windows.1/Git-2.40.1-64-bit.exe for /f "delims=" %%a in (current_version.txt) do set current_version=%%a del current_version.txt for /f "tokens=3 delims= " %%a in ('git --version') do set installed_version=%%a if %installed_version% LSS %current_version% ( echo 发现新版本Git,正在更新... curl -o git.exe https://github.com/git-for-windows/git/releases/download/v2.40.1.windows.1/Git-2.40.1-64-bit.exe start /wait git.exe /VERYSILENT /NORESTART /SUPPRESSMSGBOXES /CLOSEAPPLICATIONS /SP- /RESTARTAPPLICATIONS /COMPONENTS="icons,ext\reg\shellhere,assoc,assoc_sh" del git.exe echo Git更新完成! ) else ( echo Git已是最新版本! ) ) echo. echo 正在克隆StableDiffusion... if not exist %stable_diffusion% ( echo 未检测到StableDiffusion,正在克隆https://github.com/AUTOMATIC1111/stable-diffusion-webui... cd %home% git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui %stable_diffusion% echo StableDiffusion克隆完成! ) else ( cd %stable_diffusion% git remote get-url origin | findstr /C:"https://github.com/AUTOMATIC1111/stable-diffusion-webui" >nul if %errorlevel% equ 0 ( echo 已检测到StableDiffusion,正在更新... git pull echo StableDiffusion更新完成! ) else ( echo StableDiffusion非指定版本,正在清空文件夹并重新克隆https://github.com/AUTOMATIC1111/stable-diffusion-webui... rd /s /q %stable_diffusion% git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui %stable_diffusion% echo StableDiffusion克隆完成! ) ) pause ``` 脚本执行完毕后会自动暂停,您可以手动关闭窗口。如果需要自动关闭窗口,可以将最后一行的 `pause` 改为 `timeout /t 5 >nul`,表示等待5秒后自动关闭窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值