使用用户名和密码登录VBScript FTP

时间:2009-06-30 12:57:41

标签: vbscript ftp login passwords username

我正在尝试更新一个VBScript(很少有这方面的经验,我做了很多VB.NET),它读取一个FTP目录并每天将某些文件移动到一个新的本地目录。我有一个旧代码,可以在使用匿名登录的FTP站点上运行,但我现在需要它来访问需要用户名和密码的FTP站点。

这是我目前的代码 -

Sub MoveNSPurolatorFile()

Dim NSPurolatorFTPSite, NSPurolatorMoveFilePath, NSPurolatorFTPFolder, NSPurolatorFTPFileName

Dim folder, files
Dim fso

set fso = CreateObject("Scripting.FileSystemObject")

NSPurolatorFTPSite="\\xxx.xxx.x.xx\"
NSPurolatorMoveFilePath = "F:\TestDirectory"
NSPurolatorFTPFolder = "TestFolder"

NSPurolatorFTPFileName =  "MAN0201.CSV"

If InStr(NSPurolatorFTPFileName, "_processed") = 0 and InStr(NSPurolatorFTPFileName, ".CSV") > 0 Then

    If fso.FolderExists(NSPurolatorFTPSite & NSPurolatorFTPFolder) Then

        If fso.FileExists(NSPurolatorFTPSite & NSPurolatorFTPFolder & NSPurolatorFTPFileName) Then

            objfile.writeline "NS Purolator File Found: " & NSPurolatorFTPSite & NSPurolatorFTPFolder & NSPurolatorFTPFileName
            fso.copyFile NSPurolatorFTPSite & NSPurolatorFTPFolder & NSPurolatorFTPFileName, NSPurolatorMoveFilePath & "\"  

        Else
            objfile.writeline "File does not exist: " & NSPurolatorFTPSite & NSPurolatorFTPFolder & NSPurolatorFTPFileName 
        End If 

    End If

End If

Next

End Sub

它说该文件夹不存在,但我知道它确实存在,当我对不需要用户名和密码的ftp站点运行此代码时,它工作正常。我想我的问题是 - 在尝试访问文件夹等之前,如何使用VBScript将用户名和密码传递到ftp站点?

感谢。

4 个答案:

答案 0 :(得分:4)

这确实是一种非常糟糕的方法。您不能只将远程FTP站点上的文件夹视为本地文件夹。

你真的应该使用InetCtrls.Inet.1

这是我从其他地方取消的一个例子,它不能满足您的需求,但包含您需要的所有部件 - 您需要将其拆开以满足您的需求。

'Option Explicit
'const progname="FTP upload script by Richard Finegold"
'const url = "ftp://ftp.myftpsite.com"
'const rdir = "mydir"
'const user = "anonymous"
'const pass = "myname@mymailsite.com"

'This is an example of ftp'ing without calling the external "FTP" command
'It uses InetCtrls.Inet.1 instead
'Included is a "hint" for simple downloading

'Sources:
'http://msdn.microsoft.com/library/partbook/ipwvb5/loggingontoftpserver.htm
'http://msdn.microsoft.com/library/partbook/egvb6/addinginternettransfercontrol.htm
'http://cwashington.netreach.net/ - search on "ftp" - inspiration only!

'Insist on arguments
dim objArgs
Set objArgs = Wscript.Arguments
If 0=objArgs.Count Then
   MsgBox "No files selected for operation!", vbOkOnly + vbCritical, progname
   WScript.Quit
End If


'Force console mode - csforce.vbs (with some reorganization for efficiency)
dim i
if right(ucase(wscript.FullName),11)="WSCRIPT.EXE" then
  dim args, y
  For i = 0 to objArgs.Count - 1
    args = args + " " + objArgs(i)
  Next
  Set y = WScript.CreateObject("WScript.Shell")
  y.Run "cscript.exe " & wscript.ScriptFullName + " " + args, 1
  wscript.quit
end if


'Do actual work
dim fso, ftpo
set fso = WScript.CreateObject("Scripting.FileSystemObject")
set ftpo = WScript.CreateObject("InetCtls.Inet.1")     'Msinet.ocx
ftpo.URL = url
ftpo.UserName = user
ftpo.Password = pass
WScript.Echo "Connecting..."
ftpo.Execute , "CD " & rdir
do
'     WScript.Echo "."
     WScript.Sleep 100     'This can take a while loop while ftpo.StillExecuting


for i = 0 to objArgs.Count - 1
     dim sLFile
     sLFile = objArgs(i)

     if (fso.FileExists(sLFile)) then
          WScript.Echo "Uploading " & sLFile & " as " & FSO.GetFileName(sLFile) & " "
          ftpo.Execute , "Put " & sLFile & " " & FSO.GetFileName(sLFile)
          'ftpo.Execute , "Get " & sRemoteFile & " C:\" & sLFile
          do
          'WScript.Echo "."
               WScript.Sleep 100     'This can take a while
          loop while ftpo.StillExecuting
     else
          MsgBox Chr(34) & sLFile & Chr(34) & " does not exist!", _
           vbOkOnly, progname
     end if
next
WScript.Echo "Closing"
ftpo.Execute , "Close"
WScript.Echo "Done!"

答案 1 :(得分:2)

这是一个非常好的方法 - 我相信这可以改进,但我得到它......: - )

Dim fso, folder1, folder2, folder2a
Set fso = CreateObject("Scripting.FileSystemObject") 
Set folder2a = fso.GetFolder("C:\temp")

ftpFolderString = "ftp://username:password@ftp.ftpsite.com/folderpath" 

targetFoldder = "C:\temp"
fileSearchStr = "searchstring"

Dim SH, txtFolderToOpen, thing
Set SH = CreateObject("Shell.Application") 

'SH.Open txtFolderToOpen 
Set folder1 = SH.NameSpace(ftpFolderString)
Set folder2 = SH.NameSpace(targetFoldder)
For Each item In folder1.items

    If InStr(LCase(item.Name),fileSearchStr) > 0 Then
        Debug.WriteLine item.Name
        folder2.CopyHere item,4
        WScript.Sleep(200)
        For Each item2 In folder2a.Files
            If item2.Name = item.Name Then
                While item2.Size < item.Size 
                    WScript.Sleep(200)
                Wend
            End If
        Next
        WScript.Sleep(200)
    End If

Next
Set SH = Nothing 
Debug.WriteLine "Done"

答案 2 :(得分:-1)

脚本是如何运行的?手动,自动?通过服务?

作为服务运行时,映射字母驱动器并不总是可用。

尝试使用该脚本以确保它甚至能够看到F:\驱动器,然后查看其他可见内容。

答案 3 :(得分:-1)

是否通过UNC路径访问FTP站点(看起来像是这样)?如果它只是一个标准的FTP地址,那么您可以在URL中加入用户名/密码,例如ftp://user:pass@myftpsite.com。如果它是您尝试使用不同凭据访问的UNC路径,那么最简单的方法可能是映射驱动器,执行工作然后取消映射驱动器。可以找到2种不同的方法here