FTP使用PowerShell下载多个文件

时间:2012-01-05 04:47:02

标签: powershell ftp download

我是PowerShell的新手,我正在尝试转换一个批处理文件,该文件根据ftp站点上的目录中的名称和扩展名下载多个文件。虽然我找到了几个下载文件的例子,但我很难找到一个展示如何下载多个文件的例子。在批处理中,我可以非常简单地使用ftp.exe和带有通配符的mget命令??

有人可以指出我正确的方向。

提前致谢。 约翰

8 个答案:

答案 0 :(得分:1)

  

在批处理中,我可以简单地使用ftp.exe和mget命令   用通配符??

如果您愿意,可以在Powershell中执行相同操作。

对于更多Powershell方式,您可以使用FTPWebRequest。见这里:http://msdn.microsoft.com/en-us/library/ms229711.aspx。您可以在示例的基础上构建循环下载多个文件。

但是,底线是,您不必将批量生产的东西转换为Powershell。如果你愿意,你可以批量生产,特别是在调用外部程序时,也应该可以正常工作。

答案 1 :(得分:1)

有多种方法可以实现这一目标。一种是使用System.Net.FtpWebRequest,如下例所示: http://www.systemcentercentral.com/BlogDetails/tabid/143/IndexID/81125/Default.aspx

或者您可以使用/ n软件NetCmdlet:

http://www.nsoftware.com/powershell/tutorials/FTP.aspx

答案 2 :(得分:1)

您可能想要检查的另一个资源:PowerShell FTP客户端模块

http://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-db6fe0cb

答案 3 :(得分:0)

奇怪的是,没有内置的cmdlet来处理FTP。我不确定为什么PowerShell团队做出了这个决定,但这意味着你将不得不依赖于使用.NET代码,第三方脚本/模块/管理单元或Win32程序(如FTP.exe),因为其他人已经回答。

以下是使用.NET代码下载多个文件(二进制文件和文本)的示例:

$files = "Firefox Setup 9.0.exe", "Firefox Setup 9.0.exe.asc"
$ftpFolder = 'ftp://ftp.mozilla.org/pub/firefox/releases/9.0/win32/en-US'
$outputFolder = (Resolve-Path "~\My Documents").Path

foreach ($file in $files) {
    try {
        $uri = $ftpFolder + '/' + $file
        $request = [Net.WebRequest]::Create($uri)
        $request.Method = [Net.WebRequestMethods+Ftp]::DownloadFile
        $responseStream = $request.GetResponse().GetResponseStream()

        $outFile = Join-Path $outputFolder -ChildPath $file
        $fs = New-Object System.IO.FileStream $outFile, "Create"

        [byte[]] $buffer = New-Object byte[] 4096

        do {
            $count = $responseStream.Read($buffer, 0, $buffer.Length)
            $fs.Write($buffer, 0, $count)
        } while ($count -gt 0)

    } catch {
        throw "Failed to download file '{0}/{1}'. The error was {2}." -f $ftpFolder, $file, $_
    } finally {
        if ($fs) { $fs.Flush(); $fs.Close() }
        if ($responseStream) { $responseStream.Close() }
    }
}

答案 4 :(得分:0)

@Jacob。你需要:: ListDirectory方法来制作一个列表。之后,您必须使用out-file命令在文本文件中输出它。之后,使用get-content命令导入列表。因此,使用文本文件,您可以使用foreach循环创建对象集合(不要忘记跳过带有'-cne'条件的最后一行)。 你在这个循环中包含你的download-ftp函数和你的循环参数。 明白了吗?不确定我的解释是否合适。

所以我的一个脚本有一个例子:

$files = Get-FtpList $ftpSource $ftpDirectory $ftpLogin $ftpPassword | Out-File -Encoding UTF8 -FilePath list.txt

$list = Get-Content -Encoding UTF8 -Path list.txt

foreach ($entry in $list -cne "")
{
Get-FtpFile $ftpSource $ftpDirectory $entry $target $ftpLogin $ftpPassword
Start-Sleep -Milliseconds 10
}

希望它现在适合你。

PS:Get-FtpList和Get-FtpFile是自定义函数。

答案 5 :(得分:0)

这就是我所做的。因为我需要根据模式下载文件,我动态创建了一个命令文件,然后让ftp完成剩下的工作。 我使用了基本的powershell命令。我不需要下载任何其他组件 我首先检查是否存在必需数量的文件。如果他们这样做我第二次使用Mget调用FTP。 我从连接到Windows XP远程服务器的Windows 2008 Server运行它

            function make_ftp_command_file($p_file_pattern,$mget_flag)
               {
               # This function dynamically prepares the FTP file
               # The file needs to be prepared daily because the pattern changes daily
               # Powershell default encoding is Unicode
               # Unicode command files are not compatible with FTP so we need to make sure we create an  ASCII File

               write-output "USER" | out-file -filepath C:\fc.txt -encoding ASCII
               write-output "ftpusername" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               write-output "password" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               write-output "ASCII" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               If($mget_flag -eq "Y")
               {
                  write-output "prompt" | out-file -filepath C:\fc.txt -encoding ASCII -Append
                  write-output "mget $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               }
               else
               {
                  write-output "ls $p_file_pattern" | out-file -filepath C:\fc.txt -encoding ASCII -Append
               }          

               write-output quit | out-file -filepath C:\fc.txt -encoding ASCII -Append

            }

            ###########################  Init Section ###############################
            $yesterday = (get-date).AddDays(-1)
            $yesterday_fmt = date $yesterday -format "yyyyMMdd"
            $file_pattern = "BRAE_GE_*" + $yesterday_fmt + "*.csv"
            $file_log = $yesterday_fmt + ".log"

            echo  $file_pattern
            echo  $file_log



            ############################## Main Section ############################
            # Change location to folder where the files need to be downloaded
            cd c:\remotefiles

            # Dynamically create the FTP Command to get a list of files from the Remote Servers
            echo "Call function that creates a FTP Command "
            make_ftp_command_file $file_pattern N


            #echo "Connect to remote site via FTP"
            # Connect to Remote Server and get file listing
            ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log

            $matches=select-string -pattern "BRAE_GE_[A-Z][A-Z]*" C:\logs\$file_log

            # Check if the required number of Files available for download
            if ($matches.count -eq 36)
            {
                # Create the ftp command file
                    # this time the command file has an mget rather than an ls
                make_ftp_command_file $file_pattern Y
                    # Change directory if not done so
                cd c:\remotefiles
                    # Invoke Ftp with newly created command file
                ftp -n -v -s:C:\Clover\scripts\fc.txt 10.129.120.31 > C:\logs\$file_log 
            }
            else
            {
                echo "Full set of Files not available"
            }

答案 6 :(得分:0)

这不是Powershell特有的。但到目前为止,我已尝试过许多其他解决方案

http://ncftp.com/客户端效果最佳。它附带ncftpls.exe用于列出远程文件,ncftpget.exe用于获取文件。将它们与Start-Process -Wait

一起使用

答案 7 :(得分:0)

文件列表可以在变量中构造,并与常规FTP命令一起使用....

$FileList="file1_$cycledate.csv
file2_$cycledate.csv
file3_$cycledate.csv
file4_$cycledate.csv"

"open $FTPServer
    user $FTPUser $FTPPassword
ascii
cd report
" +
($filelist.split(' ') | %{ "mget $_" }) | ftp -i -n